Android.mk 的可配置參數會比較多,可是經常使用的可能不多。在進行多項目 ndk 共享的時候,若是對各個參數比較瞭解,對項目的結構優化有不小的好處。android
根據 Android 構建系統要求,Android.mk 文檔必須以 LOCAL_PATH 變量的定義開頭。安全
LOCAL_PATH := $(call my-dir)
Android 構建系統利用 LOCAL_PATH 來定位源文件。由於將改變量設置爲硬編碼值不合適,因此 Android 構建系統提供了一個名爲 my-dir 的宏功能。經過將該變量設置爲 my-dir 宏功能的返回值,能夠將其放在當前目錄下。函數
Android 構建系統將 CLEAR_VARS 變量設置爲 clear-vars.mk 片斷的位置。包含 Makefile 片斷能夠清除除了 LOCAL_PATH 之外的LOCAL_name 變量,例如 LOCAL_MODULE 與 LOCAL_SRC_FILE 等。優化
Include $(CLEAR_VARS)
這樣作是由於 Android 構建系統能夠在單次執行中解析多個構建文件和模式定義,LOCAL_<name> 是全局變量。清除它們能夠避免衝突,每個原生組件被稱爲一個模塊。ui
改變了是用來給這些模塊設定一個惟一的名稱。下面的代碼將該模塊的名稱設爲 hello-jni:this
LOCAL_MODULE := hello-jni
由於模塊名稱也被用於給構建過程的所生成的文件命名,因此構建系統給文件添加適當的前綴和後綴。本例中, hello-jni 模塊會生成一個共享文件且構建系統會將它命名爲 libhello-jni.so。編碼
該變量用來創建和組裝這個模塊的源文件列表。debug
LOCAL_SRC_FILES := hello-jni.c
這裏,hello-jni 模塊只有一個源文件生成,而 LOCAL_SRC_FILES 變量能夠包含用空格分開的多個源文件名。code
爲了創建可供主應用程序使用的模塊,必須將該模塊變成共享庫。Android NDK 構建系統將 BUILD_SHARED_LIBRARY 變量設置成 build_shared_libray.mk 文件保存的位置。改 Makefile 片斷包含了將源文件構建和組裝成共享庫的必要過程。orm
include $(BUILD_SHARED_LIBRARY)
創建靜態庫,Android 應用並不直接使用靜態庫,通常是將第三方代碼做爲靜態庫引入動態庫中使用。
include $(BUILD_STATIC_LIBRARY)
LOCAL_SHARED_LIBRARY := avilib_share LOCAL_STATIC_LIBRARY := avilib_static
多個項目共享某個模塊時,先將源碼導入%NDK_HOME%/source
,配置好對應的 Android.mk 文件。在須要的項目中添加:
LOCAL_SHARED_LIBRARIES := avilib $(call import-module, transcode/avilib)
將已編譯好的 so 文件做爲項目的共享模塊:
LOCAL_PATH := $(call my-dir) #第三方模塊 include $(CLEAR_VARS) LOCAL_MODULE := avilib LOCAL_SRC_FILES := libavilib.so include $(RREBUILT_SHARED_LIBRARY)
include $(BUILD_EXECUTABLE)
#目標 CPU 體系結構名稱 TARGET_ARCH := arm #目標 Android 平臺名稱 TARGET_PLARFORM := andoid-3 #目標 CPU 體系結構和 ABI 名稱 TARGET_ARCH_ABI := armeabi-v7a #目標平臺和 ABI 串聯 TARGET_ABI := android-3-armeabi-v7a #重定向輸出文件名(默認爲 LOCAL_MODULE) LOCAL_MODULE_FILENAME := avilib #指定 C++ 源碼文件擴展名 LOCAL_CPP_EXTENSION := .cpp .cxx #指定模塊所依賴的具體 C++ 特性 LOCAL_CPP_FEATURES := rtti #可選目錄列表,NDK安裝目錄的相對路徑,用來搜索頭文件 LOCAL_C_INCLUDES := sources/shared-module #添加編譯器標誌(添加宏定義) LOCAL_CFLAGS := -DNDEBUG -DPROT=1234 #添加編譯器標誌(添加宏定義)僅C++ LOCAL_CPP_CFLAGS := -DNDEBUG -DPROT=1234 #LOCAL_STATIC_LIBRARY變體,全部靜態庫內容(當幾個靜態庫有循環依賴的時候頗有用) LOCAL_WHOLE_STATIC_LIBRARY := avilib bvilib #連接標誌的可選列表 LOCAL_LDLIBS := -llog #禁止生產文件中進行缺失符號檢查 LOCAL_ALLOW_UNDEFINED_SYMBOLS : #指定要生成的 ARM 二進制類型 LOCAL_ARM_MODE := arm #開啓 NEON 指令 LOCAL_ARM_NEON := true #禁用 NX bit 安全特性(Never Execute) LOCAL_DISABLE_NO_EXECUTE := true #記錄一組編譯器標誌 LOCAL_EXPORT_CFLAGS := -DENABLE_AUDIO #與上面類型,僅用於 C++ LOCAL_EXPORT_CPPFLAGS := -DENABLE_AUDIO #與 LOCAL_EXPORT_CFLAGS 類型用於連接器標誌 LOCAL_EXPORT_LDFLAGS := -DENABLE_AUDIO #容許記錄路徑集 LOCAL_EXPORT_C_INCLUDES := #用於有大量資源或者獨立的靜態庫/動態庫的模塊,分解命令長度 LOCAL_SHORT_COMMANDS := true #定義了用於過濾來至 LOCAL_SRC_FILES變量的裝配文件的應用程序 LOCAL_FILTER_ASM :=
#返回當前目錄下的全部子目錄下的 Android.mk 構建文件列表 include $(call all-subdir-makefiles) #放回當前 Android.mk 構建文件的路徑 this-makefile #返回包含當前構建文件的父 Android.mk 構建文件路徑 parent-makefile #和 parent-makefile 同樣但用於祖父目錄 grand-parent-makefile
LOCAL_ 和 NDK_ 開頭的爲預留構建名稱,可以使用 MY_ 開頭的變量
MY_SRC_FILES := avilib.c platform_posix.c LOCAL_SRC_FILES := $(addprefix avilib/, $(MY_SRC_FILES))
在每一個體繫結構中包含一個不一樣的源碼文件集
ifeq ($(TARGET_ARCH), arm) LOCAL_SRC_FILES += armonly.c else LOCAL_SRC_FILES += generic.c endif
#覆蓋 Android.mk 構建的模塊列表 APP_MODULES := avilib #設置二進制文件的優化級別,默認 release APP_OPTIM := relase / debug #編譯器標誌 APP_CLAGS #編譯器標誌,做用於 C++ 源文件 APP_CPPLAGS #從非 jni 子目錄下查找 Android.mk 構建文件 APP_BUILD_SCRIPT #構建系統的二進制文件,默認 armeabi ABI APP_ABI := all / armeabi mips #使用不一樣 STL 實現庫,默認 system 庫 APP_STL := stlport_shared #與 LOCAL_CPP_EXTENSIONS 變量類似,代表全部模塊都依賴與具體的 C++ 特性,如 RTTI,exceptions APP_GUNSTL_FORCE_CPP_FEATURES #與 LOCAL_SHORT_COMMANDS 變量相似 APP_SHORT_COMMANDS
原文地址: Android.mk 配置參數