android jni stl,Android NDK中C++ STL库动态和静态链接

0x00 本文参考

我们在开发NDK的时候,经常需要使用C++ STL库开发,那么这些库是如何和我们的程序链接的呢?

0x01 C++ STL分类

6d4071c30aaa7be2f12128a802e43bfc.png

注意:libstdc++.so是android源码工程下,~/android-4.2.2/bionic/libstdc++目录下的代码生成的。这个so,在手机中位于/system/lib/libstdc++.so,每个进程都会默认加载一份。可以通过cat /proc/pid/maps来查看到。

这些静态链接库和动态链接库都位于哪呢?

答案是位于ndkpat/sources/cxx-stl。我们截图看下这个目录:

59c9c19a73268b2339f3ff81d0aeb5e0.png

我们可以清晰的对照两张图。libstlport_shared.so和libstlport_static.a都在这个目录的libs/armeabi中。

那么我们如何静态或者动态链接某个库呢?

答案是:

在Application.mk中,加入:APP_STL := stlport_static,表示需要静态链接libstlport_static.a。最后在工程目录libs/armeabi目录中,只会生成要编译的so,由于这个so静态链接了libstlport_static.a,所以文件的大小会比较大。

如果加入:APP_STL := stlport_shared,表示需要动态链接libstlport_shared.so。最后在工程目录libs/armeabi目录,会生成要编译的so(体积较小,没有静态链接)和libstlport_shared.so。这两个so都会被放入/data/data/packageName/libs目录下。在使用中,需要同时System.loadlibrary两个so。

0x02 在NDK中使用第三方库

0x03 Android源码环境中使用stl

stl源码位于~/android-4.2.2/external/stlport目录下。

LOCAL_SHARED_LIBRARIES := \

libstlport \

LOCAL_C_INCLUDES := \

bionic \

external/stlport/stlport \

bionic是需要的,里面虽然不是标准库文件,但标准库文件可能需要它。

另外,并不是所有的STL功能都能用,只是常用的一部分。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值