0. 前言
使用gnustl_static
,尽量避免使用gnustl_share
。此外gnustl将逐步废弃!
1. gnustl
1.1 简介
gnustl: Android上的GNU C++库,对应GNU/Linux系统中的libstdc++。
- 这个库和GCC仅仅绑定,但是后期不再更新,最新NDK不再支持
- 此库和Clang存在部分冲突
Note: 新版NDK将会删除此库,从NDK16开始,被libc++替代。
静态库:libgnustl_static.a
动态库:libgnustl_shared.so
1.2 设定
只能在Application.mk设置
APP_STL := gnustl_shared
or
APP_STL := gnustl_static
2. gnustl_static
VS gnustl_share
2.1 gnustl_static
当使用static library时,相关代码被连接到编译输出库中,这会造成目标文件变大。
优点:
- 目标文件已经包含所依赖的代码,不受运行环境的影响。
缺点:
- 目标文件变大,不利于复用
优缺点同标准静态连接库相同。
2.2 gnustl_share
动态链接库:依赖代码不编译到目标文件中。
优点:
- 目标文件体积小。
缺点:
- 需要动态链接依赖库,由于gnustl是系统库,所以不需要额外输出
libgnustl_share.so
。但是由于Android系统的碎片化,各个版本的libgnustl_share.so
不一致,就导致崩溃或者运行异常问题。
2.3 结论
鉴于gnustl_share存在诸多不稳定问题,所以尽量采用gnustl_static替代gnustl_share。
3. gnustl_share
崩溃解决方案
统一采用NDK10中的gnustl_share
的库,然后在Android.mk和代码中显示加载此库。具体步骤如下:
- 使用NDKr9c或者r10e
- Copy:
libgnustl_shared.so <= /sources/cxx-stl/gnu-libstdc++/4.8/libs/armeabi/
- 显示加载复制出来的
gnustl_share
System.loadLibrary("gnustl_shared")
4. 补充
APP_STL的取值:
system(default)系统默认的C++运行库
stlport_static以静态链接方式使用的sttport版本的STL
stlport_shared以动态链接方式使用的sttport版本的STL
gnustl_static以静态链接方式使用的gnustl版本的STL
gnustl_shared以动态链接方式使用的gnustl版本的STL
gabi++_static以静态链接方式使用的gabi++
gabi++_shared以动态链接方式使用的gabi++
c++_static以静态链接方式使用的LLVM libc++
c++_shared以动态链接方式使用的LLVM libc++
就目前的情况,LLVM的支持要优于GNU,所以推荐使用“c++_static”
5. Reference
[1] https://developer.android.google.cn/ndk/guides/cpp-support.html?hl=zh-cn#gn
[2] http://forum.cocos.com/t/gnustl/44779/3
[3] https://stackoverflow.com/questions/43089065/what-is-the-difference-between-gnustl-shared-and-gnustl-static-in-android-ndk-li