Android NDK Application.mk(中文翻譯)

做者:阿寶 
更新:2016-08-31 
來源:彩色世界(https://blog.hz601.org/2016/07/26/android-NDK-application-mk/index.html) html

英文原版: Android NDK Application.mkandroid

前言

Application.mk文件用來講明一款APP依賴於哪些本地模塊。本地模塊能夠是靜態連接庫,動態連接庫,或者可執行文件。c++

注: 咱們強烈建議你在閱讀本文以前,先閱讀 Android.mk,以便更好的理解。api

概述

Application.mk文件是一個迷你的GNU Makefile片斷,用來定義一些編譯變量。Application.mk文件通常放在$PROJECT/jni/目錄下,其中$PROJECT表明項目目錄。也能夠把文件放在$NDK/app/ /目錄下,其中$NDK爲NDK根目錄, 爲項目簡稱。例如 app

$NDK/apps/<myapp>/Application.mk

變量

APP_PROJECT_PATH

此變量值必須是項目根目錄的絕對路徑。用於指定JNI生成的.so文件的安裝路徑或拷貝路徑。
注:此變量對於概述中的第一種方法是可選的,但對於第二種方法倒是必須的。ide

APP_OPTIM

可選值爲 release 或 debug。用來設置編譯器的編譯優化級別。優化

默認爲 release 模式,用於生成優化過的二進制機器碼。debug 模式用於生成未優化的二進制機器碼,方便調試錯誤。ui

不管在哪一種模式下,均可以進行調試。不一樣的是在release模式下調試器可提供的信息更少。好比,一些被優化過的變量,是沒法用於檢查,單步調試,或者跟蹤的。debug

若是在項目的manifest文件中聲明瞭 android:debuggable 標籤,那麼Apllication.mk文件中此變量的默認值被修改成 debug。你也能夠在Apllication.mk文件中設置此變量來覆蓋manifest文件中的設置。調試

APP_CFLAGS

此變量用來指定編譯C/C++代碼的編譯選項。當你須要修改某個指定模塊的編譯參數時,能夠修改此變量,而沒必要去修改Android.mk文件。

此變量中涉及到的文件路徑,可使用相對路徑(相對於NDK根目錄),或絕對路徑。例如

sources/foo/Android.mk
sources/bar/Android.mk

若是你想要在編譯模塊時把bar目錄添加進foo/Android.mk文件中,能夠這樣作:

APP_CFLAGS += -Isources/bar

或者這樣:

APP_CFLAGS += -I$(LOCAL_PATH)/../bar

注意,不能使用 -I../bar 這樣的方式,由於它會被編譯器解析爲 -I$NDK_ROOT/../bar,這明顯不是咱們想要的結果。

注: 在android-ndk-1.5_r1版本中,此變量只能用於C代碼。以後的版本中C/C++都是支持的。

APP_CPPFLAGS

此變量用來指定編譯C++代碼的編譯選項。

注: 在android-ndk-1.5_r1版本中,此變量同時適用於C和C++代碼。以後的版本中只支持C++代碼。若是要同時支持C/C++代碼,可使用APP_CFLAGS變量。

APP_LDFLAGS

此變量用來指定生成應用時使用到的連接選項。此選項用於編譯動態連接庫和可運行程序,當編譯靜態連接庫時,此選項被忽略。

APP_BUILD_SCRIPT

此變量用來指定NDK編譯腳本,默認爲jni/Android.mk。可使用相對路徑(相對於NDK根目錄),或絕對路徑。

APP_ABI

默認狀況下,NDK會使用'armeabi' ABI來生成二進制機器碼,這是基於ARMv5TE並支持浮點運算的機器碼。可使用此變量來指定不一樣的ABI。下表中列出了適用於不一樣指令集的 ABI 選項。

表1:不一樣指令集下的 APP_ABI 設置

指令集 取值
支持基於armv7 FPU指令集的設備 APP_ABI := armeabi-v7a
ARMv8 AArch64 APP_ABI := x86
IA-32 APP_ABI := x86
Intel64 APP_ABI := x86_64
MIPS32 APP_ABI := mips
MIPS64 (r6) APP_ABI := mips64
支持全部指令集 APP_ABI := all

注: 從NDKr7開始支持all取值。

你能夠同時指定多個取值,取值之間使用空格分隔。例如

APP_ABI := armeabi armeabi-v7a x86 mips

有關可用的ABI列表,信息,及使用限制,參考這裏ABI Management

APP_PLATFORM

此變量用來指定目標Android平臺的名稱。例如'android-3'表明了Android 1.5系統。完整的Android平臺名稱及系統版本參見Android NDK Native APIs

APP_STL

默認狀況下,NDK經過Androoid自帶的迷你C++運行庫(system/lib/libstdc++.so)來提供標準C++頭文件。另外,NDK提供了可供選擇的C++實現,你能夠經過此變量來指定在程序內使用或連接的C++庫。更多有關支持的C++庫和特性參見這裏NDK Runtimes and Features

APP_SHORT_COMMANDS

此變量用來給全部的模塊設置LOCAL_SHORT_COMMANDS選項。更詳細的說明查看 Android.mk 的LOCAL_SHORT_COMMANDS選項。

NDK_TOOLCHAIN_VERSION

此變量用來指定編譯器(默認爲GCC)的版本。64位ABI默認GCC版本爲4.9,32位默認爲4.8。若是使用Clang編譯器,可選值爲clang3.4 或 clang3.5 或 clang。clang表示使用最新版本。

APP_PIE

安卓動態連接器,從4.1系統(API 16)開始支持基於位置的可執行程序(PIE)特性。從5.0系統(API 21)開始,可執行程序依賴於PIE特性。經過設置-fPIE選項來編譯支持PIE的可執行程序。糟糕的是,這個選項會讓隨機代碼位置引發的內存泄露的分析變得更加困難。

若是項目目標爲SDK 16或以上版本,ndk-build會默認啓用此選項。固然你也能夠設置爲false來禁用此選項。

此選項僅對可執行程序有效。換句話說,在編譯動/靜態庫時使用無任何效果。

注: 此選項不支持安卓4.1之前的系統。

APP_THIN_ARCHIVE

此選項用來給全部的模塊設置LOCAL_THIN_ARCHIVE默認值。更多信息請查看Android.mk的LOCAL_THIN_ARCHIVE選項。

相關文章
相關標籤/搜索