NDK 提供對 ndk-build 和 CMake 的官方支援。大部分使用者都應參閱這些指南中的其中一份,瞭解如何建構應用程式程式碼。本文件旨在說明如何建構採用其他建構系統的現有程式碼。這種情況通常出現於不是 Android 特有的第三方依附元件中,例如 OpenSSL 和 libbzip2。
如果建構系統維護人員想要為建構系統新增原生 NDK 支援,則應改為參閱建構系統維護人員指南。
總覽
只需最少設定,即可使用 NDK 中的 Clang 編譯器定義目標環境。
為確保您使用正確的架構進行建構,請傳送適當的
叫用 Clang 時,目標為 -target
。例如,如要編譯 64 位元版本
minSdkVersion
為 21 的 ARM Android 請執行下列步驟:
$ $NDK/toolchains/llvm/prebuilt/$HOST_TAG/bin/clang++ \
--target aarch64-linux-android21 foo.cpp
或者,也可找到 Clang 且目標前置字元的進入點。例如
視 NDK 版本而定,轉送至 clang 的符號連結或指令碼
以及主機作業系統直接使用 --target
叫用 Clang 將更加可靠,
這是最受測試的工作流程,而且偶爾會發生引數轉送
修正指令碼中的錯誤在 Windows 上,轉寄需要額外的 CreateProcess
指出程式碼與原始編譯器之間的差異
會對建構速度造成負面影響
$ $NDK/toolchains/llvm/prebuilt/$HOST_TAG/bin/aarch64-linux-android21-clang++ \
foo.cpp
在這兩種情況下,請將 $NDK
替換為 NDK 的路徑,並將 $HOST_TAG
替換為您依照下表下載的 NDK 的路徑:
NDK OS 變化版本 | 主機標記 |
---|---|
macOS | darwin-x86_64 |
Linux | linux-x86_64 |
64 位元 Windows | windows-x86_64 |
這裡的前置字串或目標引數格式是目標三元組,並在結尾加上表示 minSdkVersion
的後置字串。這個後置字串只能搭配 clang/clang++ 使用,binutils 工具 (例如 ar
和 strip
) 則因為不受 minSdkVersion
影響而不需要後置字串。Android 支援的目標三元組如下:
ABI | 三元組 |
---|---|
armeabi-v7a | armv7a-linux-androideabi |
arm64-v8a | aarch64-linux-android |
x86 | i686-linux-android |
x86-64 | x86_64-linux-android |
許多專案的建構指令碼預計使用 GCC 樣式的交叉編譯器,其中每個編譯器僅指定一個 OS/架構組合,因此可能無法正常處理 -target
。在這些情況下,您通常可以加入 -target
做為編譯器定義的一部分 (例如 CC="clang -target
aarch64-linux-android21
)。在極少數情況下,您使用的建構系統:
無法使用該表單,請使用前置字串為三元組的 Clang 二進位檔。
Autoconf
透過 Autoconf 專案,您可以指定與環境變數搭配使用的工具鏈。例如,以下範例說明如何在 Linux 上透過 API 級別 21 的 minSdkVersion
為 Android x86-64 建構 libpng
。
# Check out the source. git clone https://github.com/glennrp/libpng -b v1.6.37 cd libpng
# Only choose one of these, depending on your build machine... export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/darwin-x86_64 export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
# Only choose one of these, depending on your device... export TARGET=aarch64-linux-android export TARGET=armv7a-linux-androideabi export TARGET=i686-linux-android export TARGET=x86_64-linux-android
# Set this to your minSdkVersion. export API=21
# Configure and build. export AR=$TOOLCHAIN/bin/llvm-ar export CC="$TOOLCHAIN/bin/clang --target=$TARGET$API" export AS=$CC export CXX="$TOOLCHAIN/bin/clang++ --target=$TARGET$API" export LD=$TOOLCHAIN/bin/ld export RANLIB=$TOOLCHAIN/bin/llvm-ranlib export STRIP=$TOOLCHAIN/bin/llvm-strip ./configure --host $TARGET make
這個範例中選取的工具適用於 NDK r22 及更新版本。舊版 NDK 可能需要不同的工具。
非 autoconf make 專案
部分 makefile 專案允許覆寫與 autoconf 專案相同的變數,藉此進行跨平台程式碼編譯。例如,以下範例說明如何為 Android x86-64 (minSdkVersion
為 21) 建構 libbzip2
。
# Check out the source.
git clone https://gitlab.com/bzip/bzip2.git
cd bzip2
# Only choose one of these, depending on your build machine...
export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/darwin-x86_64
export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
# Only choose one of these, depending on your device...
export TARGET=aarch64-linux-android
export TARGET=armv7a-linux-androideabi
export TARGET=i686-linux-android
export TARGET=x86_64-linux-android
# Set this to your minSdkVersion.
export API=21
# Build.
make \
CC="$TOOLCHAIN/bin/clang --target=$TARGET$API" \
AR=$TOOLCHAIN/bin/llvm-ar \
RANLIB=$TOOLCHAIN/bin/llvm-ranlib \
bzip2
這個範例中選取的工具適用於 NDK r22 及更新版本。舊版 NDK 可能需要不同的工具。