之前开发 Android 下的二进制程序都是开个 jni 目录, 手写 Android.mk, 然后调用 ndk-build 生成可执行文件, 这样的步骤. 但最近的工程需要用到 Lua 解析器执行 Lua 脚本, 因此需要处理的文件就多了, 再继续闷头写 Android.mk 就显得效率很低. 况且 CLion 也是通过 CMake 构建工程的, 因此就打算试试看能不能通过 CMake 来构建 Android 下的可执行文件.
结果当然是 OK, 现将基本配置记录如下.
基础环境
Ubuntu 14.04
CMake 3.3.0
android-ndk-r10e-linux-x86_64
准备 NDK Standalone Toolchain
虽然 NDK 的 prebuilt 目录中有提供编译链工具, 但使用起来并不方便. 所幸 NDK 还提供了一个可生成独立编译链工具的脚本. 因此先通过该脚本生成独立编译链.
$NDK/build/tools/make-standalone-toolchain.sh --toolchain=arm-linux-androideabi-4.8 --install-dir=~/app/ndk_toolchain
该脚本的大部分选项都有默认值, 一般只需指定这两个参数就行了:
--toolchain 该参数用于设置要使用的编译链, 在 $NDK/toolchains 目录下可以看到所有支持的编译链工具
--install-dir 制定生成的编译链工具的安装位置
好, 有了编译链工具后下面就简单了.
编写 CMakeLists.txt
cmake_minimum_required(VERSION 3.3)
project(demo)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99")
# Android 5.0 以上需要在此处设置 PIE
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIE")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fPIE -pie")
# 配置使用 NDK Standalone Toolchain 编译
set(NDK_STANDALONE_TOOLCHAIN ~/app/ndk_toolchain)
set(CMAKE_SYSTEM_NAME AndroidARM)
set(CMAKE_SYSTEM_VERSION 3)
set(CMAKE_C_COMPILER ${NDK_STANDALONE_TOOLCHAIN}/arm-linux-androideabi/bin/gcc)
set(CMAKE_CXX_COMPILER ${NDK_STANDALONE_TOOLCHAIN}/arm-linux-androideabi/bin/g++)
set(CMAKE_FIND_ROOT_PATH ${NDK_STANDALONE_TOOLCHAIN})
# 使用 NDK 提供的头文件
add_definitions("--sysroot=${NDK_STANDALONE_TOOLCHAIN}/sysroot")
aux_source_directory(src SOURCE_FILES)
add_executable(demo ${SOURCE_FILES})
到此就大功告成了, 是不是很简单啊? 当然也可以在 CMakeLists.txt 里加个开关来切换 x86 和 arm 平台, 方便调试, 在此就不再赘述了.