android.mk 和application.mk 詳細分析

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

 

 

發佈了85 篇原創文章 · 獲贊 20 · 訪問量 33萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章