Android.mk語法
官方文件
位於jni目錄下。用於向構建系統 描述sources和share libraries。相當於一個小版本的GNU makefile片段。
Android.mk允許你組織source到modules裡,modules可以指stati library、share ilbrary或者單獨的可執行檔案(standalone executable)。
其可定義多個module,可以多個modules公用一個source file。構建系統只是將shared librarie放到你的應用包中。另外,static libraries可以生成shared libraries。
NDK構建系統自動處理依賴關係,不需要指定 標頭檔案、顯式的依賴。
Variables and Macros
可自定義變數,不可用系統保留名:
- 名字以LOCAL_ 字首
- PRIVATE_ NDK_ APP 的字首,構建系統內部使用
- 小寫字母,如 my-dir
推薦用MY_字首
NDK-defined include variables
在解析Android.mk檔案前編譯系統已定義好的GNU Make變數。在一些情況下,NDK會多次解析Android.mk,期間variable的值可能不同。
CLEAR_VARS
include $(CLEAR_VARS)
clean LOCAL_XXX
的引數(如LOCAL_MODULE
, LOCAL_SRC_FILES
LOCAL_STATIC_LIBRARIES
),但不cleanLocal_PATH
。因為執行一個單獨的GNU執行上下文,所有的local vairable都是全域性的,所以需要配置module前clean下。
BUILD_SHARED_LIBRARY
該varaibel指向構建target為shared library的指令碼,該指令碼收集你提供的LOCAL_XXX引數,用於構建shared library。
注意該指令碼需要至少定義LOCAL_MODULE and LOCAL_SRC_FILES
,構建字尾.so
BUILD_STATIC_LIBRARY
同上,只是用於構建stati library。
不會cop static library到你的projec、packages,但是可以用來build shared libraries(see LOCAL_STATIC_LIBRARIES and LOCAL_WHOLE_STATIC_LIBRARIES)。
生成.a 字尾library
PREBUILT_SHARED_LIBRARY
LOCAL_SRC_FILES不作為source file,而是一個單獨的執行share library的路徑,如 foo/libfoo.so
也可以在別的module醫用prebuit library(用LOCAL_PREBUILTS
)
PREBUILT_STATIC_LIBRARY
類比PREBUILT_SHARED_LIBRARY
Target information variables
TARGET_ARCH
CPU家族 arm, arm64, x86, or x86_64.
TARGET_PLATFORM
Android API level number, Android 5.1 對應22:android-22
ifeq ($(TARGET_PLATFORM),android-22)
# ... do something ...
endif
TARGET_ARCH_ABI
supported CPU and architecture.
CPU and architecture Setting
ARMv7 armeabi-v7a
ARMv8 AArch64 arm64-v8a
i686 x86
x86-64 x86_64
example:
ifeq ($(TARGET_ARCH_ABI),arm64-v8a)
# \... do something \...
endif
描述模型的引數
通過variable向構建系統描述你的module,需要遵循如下步驟
- 使用CLEAR_VARS引數 初始化或undefine model的 variables
- 給variable賦值
- 設定合適的buil指令碼,使用BUILD_XXX變數 (上文中的變數)
LOCAL_PATH
指定當前檔案的路徑,CLEAR_VARS不會清除該variable。
LOCAL_PATH := $(call my-dir)
必須定義LOCAL_PATH
my-dir事macro fucntion,由構建系統提供。返回當前路徑(Android.mk的父路徑)
LOCAL_CPP_EXTENSION
更改C++ sourc file預設字尾.cpp
LOCAL_CPP_EXTENSION := .cxx .cpp .cc
LOCAL_MODULE
module名稱,預設生成的library名稱,為module名稱加 lib字首、.so或.a字尾
LOCAL_MODULE_FILENAME
指定modul出的library名稱
LOCAL_MODULE := foo
LOCAL_MODULE_FILENAME := libnewfoo
LOCAL_SRC_FILES
compile module使用的source file。會自動依賴,相對於 LOCAL_PATH的相對路徑,或絕對路徑。
LOCAL_EXPORT_CFLAGS
記錄C/C++的compiler flags給通過LOCAL_STATIC_LIBRARIES or LOCAL_SHARED_LIBRARIES 依賴的module的 LOCAL_CFLAGS
include $(CLEAR_VARS)
LOCAL_MODULE := foo
LOCAL_SRC_FILES := foo/foo.c
LOCAL_EXPORT_CFLAGS := -DFOO=1
include $(BUILD_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := bar
LOCAL_SRC_FILES := bar.c
LOCAL_CFLAGS := -DBAR=2
LOCAL_STATIC_LIBRARIES := foo
include $(BUILD_SHARED_LIBRARY)
compile bar.c時,flags -DFOO=1 and -DBAR=2傳遞給compiler.
但是compile foo.c時不會有-DFoo=1這個flag
LOCAL_CPP_FEATURES
指定c++ features,優於LOCAL_CPPFLAGS直接定義-frtti and -fexceptions,LOCAL_CPPFLAGS導致compiler應用於所有的module,而不管是否需要
For prebuilt binaries, this variable also declares which features the binary depends on, thus helping ensure the final linking works correctly
LOCAL_CPP_FEATURES := rtti
LOCAL_CPP_FEATURES := exceptions
LOCAL_CPP_FEATURES := rtti features
LOCAL_C_INCLUDES
指定list of paths,相對於NDK的root目錄,新增include搜尋路徑 在編譯sources 時
LOCAL_C_INCLUDES := sources/foo
LOCAL_C_INCLUDES := $(LOCAL_PATH)/<subdirectory>/foo
在設定LOCAL_CFLAGS or LOCAL_CPPFLAGS前定義。
系統使用的LOCAL_C_INCLUDES 當通過ndk-gdb進行native debug時
LOCAL_STATIC_LIBRARIES
當前module依賴的static libraries module列表。
當前module是shared library or
an executable,將強制其static libraries連線到最終的binary(二進位制檔案)內
當前是static library,僅僅表明依賴於當前module的module也將依賴於 這個variable的資料(static libraries)
LOCAL_CFLAGS
設定compiler flags當build c c++原始碼時。 LOCAL_CPPFLAGS 只用於C++
LOCAL_CFLAGS += -I<path>,
LOCAL_LDLIBS
執行時需要的系統庫(-l作為庫的字首)
LOCAL_LDLIBS := -lz
如上告訴linker生成的module在載入的時候link /system/lib/libz.so
LOCAL_EXPORT_LDLIBS
傳遞系統的libraries給compiler,在library前加L
舉例:foo作為static library,依賴於系統庫。使用它去匯出依賴。
include $(CLEAR_VARS)
LOCAL_MODULE := foo
LOCAL_SRC_FILES := foo/foo.c
LOCAL_EXPORT_LDLIBS := -llog
include $(BUILD_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := bar
LOCAL_SRC_FILES := bar.c
LOCAL_STATIC_LIBRARIES := foo
include $(BUILD_SHARED_LIBRARY)
當構建libbar.so時,使用-llog在linker命令的後面。這相當於告訴libbar.so依賴於foo,所以也依賴於系統logging library
NDK-provided function macros
my-dir
返回最近include的makefile,的路徑,常用來定義LOCAL_PATH