1. 配置Android NDK编译环境
1.1 配置NDK
首先下载NDK软件包,并解压:
$ cd ~
$ wget https://dl.google.com/android/repository/android-ndk-r19c-linux-x86_64.zip
$ unzip android-ndk-r19c-linux-x86_64.zip
$ ls android-ndk-r19c
设置NDK的环境变量:
export PATH=~/android-ndk-r19c:$PATH
1.2. 编译程序
进入工程目录,设置NDK_PROJECT_PATH,让NDK知道工程在什么位置:
cd myproject
export NDK_PROJECT_PATH=.
执行ndk-build编译:
ndk-build
指定选项 NDK_LOG=1 可以看ndk-build执行的具体过程。如使用哪个编译器,使用了哪个标准库,等等。
ndk-build NDK_LOG=1
2. C++库
2.1 有哪些C++库
Android使用的C++库有如下几种:
名称 | 说明 | 功能 |
---|---|---|
libstdc++ | 默认最小系统 C++ 运行时库 | |
gabi++_static | GAbi++ 运行时(静态) | C++ 异常和 RTTI |
gabi++_shared | GAbi++ 运行时(共享) | C++ 异常和 RTTI |
stlport_static | STLport 运行时(静态) | C++ 异常和 RTTI;标准库 |
stlport_shared | STLport 运行时(共享) | C++ 异常和 RTTI;标准库 |
gnustl_static | GNU STL(静态) | C++ 异常和 RTTI;标准库 |
gnustl_shared | GNU STL(共享) | C++ 异常和 RTTI;标准库 |
gnustl_static | GNU STL(静态) | C++ 异常和 RTTI;标准库 |
c++_static | LLVM libc++ 运行时(静态) | C++ 异常和 RTTI;标准库 |
c++_shared | LLVM libc++ 运行时(共享) | C++ 异常和 RTTI;标准库 |
- gabi++, stlport, gnustl这三种在android-ndk-19后已经不再使用了。
- libstdc++不支持STL标准库。
- 静态库c++_static导致生成程序太大,很少使用。所以最常用的还是c++_shared,也就是libc++_shared.so。
2.2 指定C++库
默认情况下,ndk-build使用libstdc++,如果要使用c++_shared,可以在Application.mk中,使用APP_STL变量指定:
$ cat jni/Application.mk
APP_ABI := armeabi-v7a arm64-v8a
APP_PLATFORM := android-28
APP_STL := c++_shared
APP_BUILD_SCRIPT := build.mk
编译过程中会自动生成libc++_shared.so。
2.3 使用readelf查看模块依赖的库
使用readelf工具可以查看模块依赖哪些库,包括C++库。
$ ~/android-ndk-r19c/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-readelf -a myproject
参考资料
深入理解使用ndk-build编译NDK程序
https://www.jianshu.com/p/26275f3d583e
NDK编译——C++ 库支持
https://blog.csdn.net/suningning/article/details/74510591
Android下怎么使用LDD查看依赖库
https://blog.csdn.net/luoyouren/article/details/50561502
网友评论