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
参考资料