利用 CMake 和 NDK 交叉編譯 Android 下的可執行程序

以前開發 Android 下的二進制程序都是開個 jni 目錄, 手寫 Android.mk, 而後調用 ndk-build 生成可執行文件, 這樣的步驟. 但最近的工程須要用到 Lua 解析器執行 Lua 腳本, 所以須要處理的文件就多了, 再繼續悶頭寫 Android.mk 就顯得效率很低. 何況 CLion 也是經過 CMake 構建工程的, 所以就打算試試看能不能經過 CMake 來構建 Android 下的可執行文件.linux

結果固然是 OK, 現將基本配置記錄以下.android

基礎環境

  • Ubuntu 14.04
  • CMake 3.3.0
  • android-ndk-r10e-linux-x86_64

準備 NDK Standalone Toolchain

雖然 NDK 的 prebuilt 目錄中有提供編譯鏈工具, 但使用起來並不方便. 所幸 NDK 還提供了一個可生成獨立編譯鏈工具的腳本. 所以先經過該腳本生成獨立編譯鏈.app

$NDK/build/tools/make-standalone-toolchain.sh --toolchain=arm-linux-androideabi-4.8 --install-dir=~/app/ndk_toolchain

該腳本的大部分選項都有默認值, 通常只需指定這兩個參數就好了:ide

--toolchain 該參數用於設置要使用的編譯鏈, 在 $NDK/toolchains 目錄下能夠看到全部支持的編譯鏈工具工具

--install-dir 制定生成的編譯鏈工具的安裝位置ui

好, 有了編譯鏈工具後下面就簡單了.idea

編寫 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 平臺, 方便調試, 在此就再也不贅述了.調試

相關文章
相關標籤/搜索