在CMake工程中使用NDK独立工具链 (一)

这里的做法只针对android-ndk-r19之前的版本。从android-ndk-r19开始,就不必再调用make_standalone_toolchain.py创建工具链了。

1. 下载 NDK

从Android官网NDK归档找到需要的NDK版本,并下载解压:

$ wget https://dl.google.com/android/repository/android-ndk-r17c-linux-x86_64.zip
$ unzip android-ndk-r17c-linux-x86_64.zip

2. 创建独立工具链

make_standalone_toolchain.py 脚本从NDK创建自定义工具链。

  • --arch指定处理器架构,
  • --api是目标 Android API 级别。这个选项决定Sysroot, Sysroot是包含目标系统头文件及库的目录。
    • 与Android API 级别相关的库位于$NDK/platfroms下,
    • 其他库及头文件位于$NDK/sysroot下
  • --stl 指定使用哪一个标准库。自 r18 起,所有独立工具链都使用 Clang 和 libc++。
$ ./build/tools/make_standalone_toolchain.py -h
optional arguments:
  --arch {arm,arm64,x86,x86_64}
  --api API                     Target the given API version (example: "--api 24").
  --stl {gnustl,libc++,stlport} C++ STL to use.
  --install-dir INSTALL_DIR     Install toolchain to the given directory instead of packaging.

如下命令创建的工具链为ARM 64位,Android API 26,安装目录为ndk-toolchain。

$./build/tools/make_standalone_toolchain.py \
  --arch arm64 \
  --api 28 \
  --install-dir=ndk-toolchain

ndk_toolchain主要包括如下目录:

  • bin 交叉编译工具,如aarch64-linux-android-clang, aarch64-linux-android-clang++等
  • sysroot 系统头文件及系统库
  • include, lib, lib64 C++标准库等

3. CMake设置

如果使用CMake构建工程,需要配置相应的CMAKE_TOOLCHAIN_FILE,如下是针对如上工具链的例子。

# toolchain file example
set (CMAKE_SYSTEM_NAME  Android)
set (CMAKE_SYSTEM_VERSION 28)
set (CMAKE_ANDROID_ARCH_ABI arm64-v8a)

set (CMAKE_ANDROID_STANDALONE_TOOLCHAIN ~/ndk_toolchain)

相关链接

CMake 常用法
用CMake构建中等规模的工程
在CMake工程中使用NDK独立工具链 (一)
在CMake工程中使用NDK独立工具链 (二)

参考资料

NDK 归档
https://developer.android.google.cn/ndk/downloads/older_releases.html

NDK - 指南 - 独立工具链
https://developer.android.google.cn/ndk/guides/standalone_toolchain

Cross Compiling for Android with a Standalone Toolchain
https://cmake.org/cmake/help/v3.12/manual/cmake-toolchains.7.html#id21