1.Android.mk
Android.mk是一個 android NDK 構建系統描述NDK項目的makefile 片段。它是每一個NDK項目必備組件。一般來說它與源代碼在同一層目錄中,下面是一個樣例文本:
LOCAL_PATH:=$(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE:= ffmpegutils
LOCAL_SRC_FILES:= com_example_myapplication_MainActivity.c com_example_myapplication_Ffmpeg.c
LOCAL_C_INCLUDES:= $(LOCAL_PATH)/include
LOCAL_LDLIBS:= -L$(LOCAL_PATH) -lm -lz -llog
include $(BUILD_SHARED_LIBRARY)
LOCAL_PATH被用來定位源文件,因爲把改變量設置爲硬編碼值並不可取,所以Android構建系統提供了一個名爲my-dir的宏功能。通過該變量設置爲my-dir宏功能的返回值。
CLEAR_VAR變量被Android系統構建設置爲clear-vars.mk的位置。可用來清除除了LOCAL_PATH以外的LOCAL_XX變量的值。這樣做是因爲Android.mk中可以同時構建多個共享庫,清除它可以避免衝突,如下所示可以構建兩個共享庫:
LOCAL_PATH:=$(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE:= ffmpegutils
LOCAL_SRC_FILES:= com_example_myapplication_MainActivity.c com_example_myapplication_Ffmpeg.c
LOCAL_C_INCLUDES:= $(LOCAL_PATH)/include
LOCAL_LDLIBS:= -L$(LOCAL_PATH) -lm -lz -llog
include $(BUILD_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE:= test
LOCAL_SRC_FILES:= test.c
LOCAL_C_INCLUDES:= $(LOCAL_PATH)/include
LOCAL_LDLIBS:= -L$(LOCAL_PATH) -lm -lz -llog
include $(BUILD_SHARED_LIBRARY)
LOCAL_MODULE用來給這些模塊設定一個唯一的名稱,也被用來給構建過程所生成的文件命名,構建系統給該文件名添加了適當的前綴和後綴。如模塊名爲hello,生成的文件名爲libhello.so.
LOCAL_SRC_FILES用來建立和組裝這個模塊的源文件列表,如有多個文件,則文件與文件之間用空格分離。
BUILD_SHARED_LIBRARY被設置成build-shared-library.mk的路徑,include $(BUILD_SHARED_LIBRARY)表明生成一個共享庫。
include $(BUILD_STATIC_LIBRARY)表明生成一個靜態庫
其他系統變量:
TARGET_ARCH: 目標體系結構名稱,例如arm
TARGET_PLATFROM:目標Android平臺名,例如android-3
TARGET_ARCH_ABI:目標CPU體系結構和ABI的名稱,例如armeabi-v7s
TARGET_ABI:目標平臺和ABI的串聯,例如:android-3-armeabi-v7s
LOCAL_MODULE_FILENAME:可選變量,重新定義生成的輸出文件名稱,如果有定義將覆蓋LOCAL_MODULE的生成文件名
LOCAL_CPP_EXTENSION: C++源文件的擴展名,默認cpp,可以指定多個擴展名,用空格分離
LOCAL_CPP_FEATURES: 指明模塊依賴的c++特性,如RTTI,exceptions等,例子:LOCAL_CPP_FEATURES :=rtti
LOCAL_C_INCLUDES:可選include路徑,NDK安裝目錄的相對路徑
....
LOCAL_C_INCLUDES :=sources/shared-module
LOCAL_C_INCLUDES :=$(LOCAL_PATH)/include
....
LOCAL_CFLAGS: 編譯選項,在編譯c和c++源文件時會被傳送給編譯器,如:LOCAL_CFLAGS := -DNDEBUG -DPORT=1234
LOCAL_CPP_FLAGS:編譯選項,在編譯c++源文件時會被傳送給編譯器
LOCAL_WHOLE_STATIC_LIBRARIES:LOCAL_STATIC_LIBRARIES的變體,用來指明應該包含在共享庫中的所有靜態庫內容
LOCAL_LDLIBS:鏈接標誌可選列表,該標誌將被傳送給鏈接器,如鏈接日誌庫,LOCAL_LDFLAGS :=-llog
LOCAL_ALLOW_UNDEFINDED_SYMBOLS:禁止在生成文件中進行缺失符號檢查。
LOCAL_ARM_MODE:ARM體系結構特有變量,默認情況下生成16位指令,該變量被設置爲arm將生成32位指令,LOCAL_SRC_FILES可指定特定文件爲arm指定,如:LOCAL_SRC_FILES :=files.c files.c.arm
LOCAL_ARM_NEON:用來指定源文件應該使用ARM高級單指令多數據流,如LOCAL_ARM_NEON :=true
定義新變量
MY_SRC_FILES :=avilib.c platform.c
LOCAL_SRC_FILES :=$(addprefilx avilib/,$(MY_SRC_FILES))
條件操作
ifeq ($(TARGET_ARCH),arm)
LOCAL_SRC_FILES += armonly.c
else
LOCAL_SRC_FILES += generic.c
endif
...
其他函數宏:
- all-subdir-makefiles:返回當前目錄的所有子目錄下的android.mk文件集
- this-makefile: 返回當前Android.mk文件路徑
- parent-makefile:返回當前構建文件的父Android.mk文件路徑
- grand-parent-makefile:返回當前構建文件的祖父Android.mk文件路徑
最後介紹一個使用共享模塊的NDK項目android.mk:
include $(CLEAR_VARS)
LOCAL_MODULES :=module
LOCAL_SRC_FILES :=module.c
LOCAL_SHARED_LIBRARIES :=avilib
include $(BUILD_SHARED_LIBRARY)
$(call import-module,transcode/avilib)
import-module需先定位共享模塊,然後再將它導入到ndk項目中,默認情況下,該宏只搜索<android ndk>/source 目錄,可以定義一個NDK_MODULE_PATH的環境變量,並將它設成共享目錄的根目錄。
2.Application.mk
APP_MODULES:模塊名,該變量可覆蓋android.mk的LOCAL_MODULE聲明的名稱
APP_OPTIM: 可爲release或debug,默認爲release
APP_CLAGS,APP_CPP_FLAGS:編譯器選項
APP_BUILD_SCRIPT:默認情況,android NDK將查找Android.mk,該變量將改變這一默認行爲。
APP_ABI: 構建的指令集,如:APP_ABI :=mips armeabi, APP_ABI:=all
APP_STL:默認情況下,將使用最小的STL運行庫,即system庫,該變量可選擇不同的stl實現,如APP_STL:= stlport_shared