田海立@CSDN 2020-11-25

Android NDK(Native Development Kit)提供了一套基于c/c++开发Android应用的工具。基于c/c++开发需要STL (Standard Template Library/标准模版库),本文描述Android NDK中提供的STL。

Android NDK开发是基于Android的,但是不绑定具体某一个Android版本,一个NDK发布版可以支持多个Android版本。

NDK开发无论静态库还是动态库,libc++都是用NDK里的发布版本打包在应用里:动态库直接在apk里带上libc++_shared.so;静态库已经把程序需要的STL的代码直接打到应用程序或其所用的native库里。

一、Android NDK中的c++运行库

Android NDK中提供下列c++运行库。

其中的各个运行库:

libc++:是LLVM c++标准库。从NDK r18之后是唯一的STL(GNU stl和stlport从 r18开始从NDK中被移除)

NDK里提供了libc++的动态库和静态库:

- 动态库: libc++_shared.so

- 静态库: libc++_static.a

注意: 虽然都是LLVM的c++ STL,此处NDK里的libc++不是Android源码中编译出的c++系统STL(libc++.so),此处的libc++是基于NDK开发时,NDK中已经编译好的库。如果NDK开发的应用用到libc++_shared.so, .so会被打包到编译出的APK里;用到libc++_static.a, .a里被用到的程序会被打到使用者的程序中的。也就是发布应用时,会带着stl一起发布,不依赖Android版本内部的stl。

system:非完全stl,完全stl需使用上面的libc++。这是与Android发布绑定的库。

System运行库指的是Android版本里的/system/lib/libstdc++.so,提供基本的c++运行支持, 提供new/delete支持,仅提供c标准库的c++封装,比如。

也不提供Exception Handling和RTTI支持。

none:没有标准库支持。

【注】以上是Android NDK r18之后的c++运行库。在之前的NDK中还提供了gnustl,是GNU的c++ STL,同样包含了动态库"gnustl_shared"(libgnustl_shared.so)以及静态库"gnustl_static"(libgnustl_static.a)支持。在那些版本的NDK里有多于一种的真正完全STL可供选择。

二、NDK开发时选择STL

NDK开发时,可以用下面方式指定c++运行库。

运行库在“c++_shared”,“c++_static”,“none”或“system”中选择其一,其中“c++_shared”,“c++_static”分别对应libc++的动态库和静态库。

2.1 cmake编译指定STL

不通过ANDROID_STL指定STL的情况下缺省是c++_static。

可以在Module级别的build.gradle文件中通过变量ANDROID_STL变量指定一个运行库:“c++_shared”,“c++_static”,“none”或“system”中选择其一。

ANDROID_STL

可选:none / system / c++_static / c++_shared

如果未设置,默认为c++_static

2.2 ndk-build里指定STL

不通过APP_STL指定STL的情况下缺省是none

可以在Application.mk文件中通过变量APP_STL变量指定一个运行库:“c++_shared”,“c++_static”,“none”或“system”中选择其一。

APP_STL

可选:none / system / c++_static / c++_shared

如果未设置,默认为none

2.3 clang编译指定STL

clang编译可以直接指定link flag。缺省是c++_shared。如果要指定静态库,用“-static-libstdc++”【这里只是链接选项,不是源码编译时的libstdc++,这里选择的实际是c++_static】

三、 c++特性支持

libc++这个STL支持Exception处理和RTTI。

3.1 Exception

缺省ndk-build里Exception处理机制是关闭的;缺省cmake编译Exception处理机制是打开的。

可以用下面方式打开Exception处理:

1)  整个程序范围打开,在Application.mk里添加:

APP_CPPFLAGS := -fexceptions

2) 在一个Module级别,在Android.mk里添加:

LOCAL_CPP_FEATURES := exceptions

# or

LOCAL_CPPFLAGS := -fexceptions

3.2 RTTI

缺省ndk-build里RTTI是关闭的;缺省cmake编译RTTI是打开的。

可以用下面方式打开RTTI:

1)  整个程序范围打开,在Application.mk里添加:

APP_CPPFLAGS := -frtti

2) 在一个Module级别,在Android.mk里添加:

LOCAL_CPP_FEATURES := rtti

# or

LOCAL_CPPFLAGS := -frtti

四、NDK版本变化

目前Android SDK里可以直接下载到的NDK的版本(r16 ~r21)里的STL、支持的Android 版本及其变化总结如下:

NDK

Release Date

STL

Supported SDK (API)

Arch

gabi++

gnustl

libc++

libc++abi

stlport

system

16b

2017-12

√ (preferred)

14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,25, 26, 27

MIPS deprecated

r17c

2018-06

√ (deprecated)

√ (deprecated)

√ (default)

√ (deprecated)

14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,25, 26, 27,28 (Android9)

MIPS removed

r18b

2018-08

√ (removed)

√ (removed)

√ (removed)

14, 15,16, 17, 18, 19, 20, 21, 22, 23, 24,25, 26, 27, 28

require 64-bit support

r19c

2019-01

14, 15,16, 17, 18, 19,20, 21, 22, 23, 24,25, 26, 27, 28

r20b

2019-06

14, 15,16, 17, 18, 19,20, 21, 22, 23, 24,25, 26, 27, 28,29 (Android10)

r21d

2020-06

14, 15,16, 17, 18, 19,20, 21, 22, 23, 24,25, 26, 27, 28,29,30 (Android11)

重大变化(表中已经明确以颜色/删除线等方式标注)总结如下:

STL变化:

r16开始优选libc++;r17开始libc++是缺省的stl,

gnustl在r17开始被标注过时并且在r18中被移除;

NDK支持Android版本的变化:

Android9(API 28)在NDK r17开始支持;

Android10(API 29)在NDK r20开始支持;

Android11(API 30)在NDK r21开始支持;

Android4.0.x(API 14/15)从NDK r18开始不再支持

五、总结

总结一下:

Android NDK开发是基于Android的,但是不绑定具体某一个Android版本,一个Android NDK发布版可以支持多个Android版本。

NDK开发无论静态库还是动态库,libc++都是用NDK里的发布版本打包在应用里:动态库直接在apk里带上libc++_shared.so;静态库已经把程序需要的STL代码直接打到应用程序或其所用的native库里。

Android NDK中的STL:libc++_shared / libc++_static / system,其中libc++是完整的STL;

NDK开发,cmake和ndk-build方式都可以指定其所用的STL;

libc++支持Exception处理和RTTI,ndk-build需要编译时打开;

NDK历史上在r18前还支持gnustl;

对Android新版本的支持随着NDK版本更新不断加入;过时的Android支持也会移除。

附:参考及进一步阅读

Android源码中的STL https://haili-tian.blog.csdn.net/article/details/109864831

Android源码中的STL:内置的libc++/libc++_static/system;内置的NDK版本中的libc++_shared/libc++_static/system(system也就是android源码中的libstdc++)

Android源码中STL的namespace https://haili-tian.blog.csdn.net/article/details/109920740

namespace in libc++【头文件:  external/libcxx/include/】:std::__1

namespace in libc++_shared【头文件:  prebuilts/ndk/current/sources/cxx-stl/llvm-libc++/include/】:std::__ndk1

来源:oschina

链接:https://my.oschina.net/u/4380417/blog/4757423

android stl,Android NDK中的c++ STL相关推荐

  1. android ndk 编译c++11,Android NDK中的c++ STL

    田海立@CSDN 2020-11-25 Android NDK(Native Development Kit)提供了一套基于c/c++开发Android应用的工具.基于c/c++开发需要STL (St ...

  2. NDK中C++标准库、STL的配置;Include其他头文件

    原文: Android学习笔记--NDK中C++标准库.STL的配置:Include其他头文件 1.STL的使用,以stlport为例 官方的说法是只需要在Application.mk文件中添加如下一 ...

  3. 【Android 逆向】Android 进程注入工具开发 ( 系统调用 | Android NDK 中的系统调用示例 )

    文章目录 一.系统调用 二.Android NDK 中的系统调用示例 一.系统调用 在 " 用户层 " , 运行的都是用户应用程序 ; 用户层 下面 是 驱动层 , 驱动层 下面是 ...

  4. 【Android 逆向】代码调试器开发 ( 使用 NDK 中的 ndk-build + Android.mk 编译 Android 平台的代码调试器可执行应用 )

    文章目录 一.Android 平台代码调试器代码 二.Android.mk 构建脚本内容 三.Application.mk 构建脚本内容 四.正式编译 五.博客资源 一.Android 平台代码调试器 ...

  5. android ndk使用c 11,使用c 11 std :: async在android ndk中使用不完整类型无效

    我尝试使用以下函数来检查android ndk中是否支持std :: async以及windows中的cygwin.我使用的功能如下 机器:64位赢得8与cygwin Eclipse:Juno 4.2 ...

  6. 在Android NDK中使用OpenSSL

    从 6.0 开始,Google 要求不要使用系统的 OpenSSL,请见:https://developer.android.com....因此,请不要再使用本文介绍的方法,请自行交叉编译 OpenS ...

  7. socket android用法,Android NDK中socket的用法以及注意事项分析

    与Java层中的套接字相比,本机层中的Socket可以选择更多的配置项,并获得关于当前拥塞状态的更准确的信息,那么 NDK中socket的用法以及注意事项分析,大家清楚吗?下文是爱站技术频道小编为大家 ...

  8. android源码中的ndk,如何在不需要Android操作系统源代码的情况下在Android NDK中创建新的NativeWindow?...

    我想编译一个Android OpenGL控制台应用程序,您可以直接从控制台启动Android x86或从Android x86 GUI中的Android终端应用程序运行.如何在不需要Android操作 ...

  9. android so导致启动慢,谈谈Android NDK中动态链接库(.so文件)的优化

    做了不少NDK相关的工作,不知道别人有没有同样的困惑,经常在编译C/C++代码的时候会出一些error或者warning,然后在网上搜,发现在Android.mk或者Application.mk文件中 ...

最新文章

  1. vue子组件获取父组件数据_在vue.js中父组件是如何向子组件传递数据的?
  2. 库洛游戏首次公开分享:《战双帕弥什》的动作打击感是怎么做出来的
  3. VS Code配置Java万能环境
  4. ***F漏洞分析与利用
  5. liunx驱动----异步通知
  6. 深入解析Linux并发同步
  7. 关于C/C++中的几个关键字(C基础)
  8. java wado_dcm4che,WADO相关
  9. [WPF自定义控件库] 自定义控件的代码如何与ControlTemplate交互
  10. 父元素浮动子元素会浮动吗_为什么quot;overflow:hiddenquot;能清除浮动的影响
  11. Atitit api design Usability simple 易用性之简单化设计 目录 1. 理论原则 2 1.1. 概念简单 2 1.2. 切换到了“write less, do more
  12. SqlMap免Python环境绿色版下载
  13. Pytorch是什么?Pytorch能用来干什么?
  14. 【车间调度】柔性作业车间调度问题的研究现状
  15. linux ap 模式,无线AP是什么,客户端模式(apclient)是什么意思?
  16. 快手信息流投放平台:快手电商宣告成年
  17. 快手视频搬运快手视频伪原创工具快手视频消重快手去重的软件短视频消重批量处理软件,短视频伪原创...
  18. 阿里云助力中小企业建站 在线免费自助建站成新用户首选
  19. 安卓开发者必看:Android的数据结构与算法——ArrayList源码解析
  20. Java对中文进行排序

热门文章

  1. Attention注意力机制总结
  2. 数据结构十大经典排序算法--Python
  3. 如何选择大数据软件开发公司
  4. apache java cache-control,Tomcat: Cache-Control
  5. android 任意剪切view,Android 任意View切圆角
  6. 2021年SWPUACM暑假集训day5单调栈算法
  7. codeforces:ProblemMset
  8. java url 格式化_String.format()的使用:Java字符串格式化
  9. python 保存dataframe_在python2中将dataframe保存到CSV
  10. Spark读取本地文件和HDFS文件