Android gnustl_static VS gnustl_share

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和代码中显示加载此库。具体步骤如下:

  1. 使用NDKr9c或者r10e
  2. Copy:
libgnustl_shared.so <= /sources/cxx-stl/gnu-libstdc++/4.8/libs/armeabi/
  1. 显示加载复制出来的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

你可能感兴趣的:(C/C++,Android,Android,NDK,C++,GNU)