Android.mk語法解析
什麼是Android.mk
Android.mk是Android提供的一種makefile檔案,用來指定諸如編譯生成so庫名、引用的標頭檔案目錄、需要編譯的.c/.cpp檔案和.a靜態庫檔案等。
Android.mk檔案用來告知 NDK Build 系統關於Source的資訊。 Android.mk將是GNU Makefile的一部分,且將被 Build System 解析一次或多次。
所以,請儘量少的在Android.mk中宣告變數,也不要假定任何東西不會在解析過程中定義。
什麼是NDK
Android NDK(Native Development Kit )是一套工具集合,允許你用像C/C++語言那樣實現應用程式的一部分。

image.png
Android.mk檔案語法允許我們將Source打包成一個"modules". modules可以是:
1. 靜態庫
2. 動態庫
基本語法:
Simple example
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE:= hello-jni LOCAL_SRC_FILES := hello-jni.c include $(BUILD_SHARED_LIBRARY)
語法介紹
現在,讓我們解釋一下這些行。
LOCAL_PATH
LOCAL_PATH := $(call my-dir)
android.mk檔案必須以本地路徑變數的定義開始。
它用於在開發樹中定位原始檔。在本例中,由構建系統提供的巨集函式'my dir'用於返回當前目錄的路徑(即包含android.mk檔案本身的目錄)。
CLEAR_VARS
include $(CLEAR_VARS)
clear_vars變數由構建系統提供,並指向一個特殊的GNU makefile,它將為您清除許多LOCAL_xxx變數。例如LOCAL_MODULE、OCAL_SRC_FILES、LOCAL_STATIC_LIBRARIES等),LOCAL_PATH除外。
這是必需的,因為所有的構建控制檔案在一個gnu make執行上下文中解析,其中所有變數都是全域性的。
LOCAL_MODULE
LOCAL_MODULE := hello-jni
必須定義LOCAL_MODULE變數以標識您在android.mk中描述的每個模組。
名稱必須是 唯一 且不包含任何空間。
請注意,構建系統將自動向相應生成的檔案新增適當的字首和字尾。換言之,名為“foo”的共享庫模組將生成“libfoo.so”。
如果您將模組命名為“libfoo”,則生成系統不會新增另一個“lib”字首,也會生成libfoo.so。
LOCAL_SRC_FILES
LOCAL_SRC_FILES := hello-jni.c
LOCAL_SRC_FILES變數必須包含C和/或C++原始檔的列表,這些檔案將被構建並組裝到模組中。
注意你應該這裡不列出標頭檔案和包含的檔案,因為構建系統將自動為您計算依賴項;只列出原始檔這將直接傳遞給編譯器。
注意,C++原始檔的預設副檔名是“.CPP”。但是,可以通過定義變數LOCAL_CPP_EXTENSION來指定不同的變數本地副檔名。不要忘記初始點(即“.cxx”有效,而不是“cxx”)。
LOCAL_SRC_FILES
include $(BUILD_SHARED_LIBRARY)
BUILD_SHARED_LIBRARY是由構建系統提供的一個變數,它指向負責收集所有自最新“include$(clear_vars)”以來,您在本地變數中定義的資訊,並確定要構建什麼以及如何構建。
當然還有BUILD_STATIC_LIBRARY來生成靜態庫。
具體的編譯變數列舉:
type | describe |
---|---|
BUILD_STATIC_LIBRARY | 編譯為靜態庫。 |
BUILD_SHARED_LIBRARY | 編譯為動態庫 |
BUILD_EXECUTABLE | 編譯為Native C可執行程式 |
NDK語法變數彙總
NDK Build System 保留以下變數名:
- 以LOCAL_ 為開頭的
- 以PRIVATE_ ,NDK_ 或者APP_ 開頭的名字。
- 小寫字母名字:如my-dir
如果想要定義自己在Android.mk中使用的變數名,建議新增MY_字首。
type | example | describ |
---|---|---|
CLEAR_VARS | include $(CLEAR_VARS) | 必須在新模組前包含之 |
BUILD_SHARED_LIBRARY | include $(BUILD_SHARED_LIBRARY) | 決定如何將你列出的Source編譯成一個動態庫 |
BUILD_STATIC_LIBRARY | include $(BUILD_STATIC_LIBRARY) | 決定如何將你列出的Source編譯成一個靜態庫 |
BUILD_EXECUTABLE | 決定如何將你列出的Source編譯成一個可執行Native程式 | include $(BUILD_EXECUTABLE) |
PREBUILT_SHARED_LIBRARY | include $(PREBUILT_SHARED_LIBRARY) | 把這個共享庫宣告為 “一個” 獨立的模組 |
PREBUILT_STATIC_LIBRARY | include $(PREBUILT_STATIC_LIBRARY) | 把這個靜態庫庫宣告為 “一個” 獨立的模組 |
TARGET_ARCH | 目標CPU架構名 | |
TARGET_PLATFORM | 目標平臺的名字 | |
TARGET_ARCH_ABI | ||
LOCAL_C_INCLUDES | LOCAL_C_INCLUDES := sources/foo | 一個可選的path列表。 |
LOCAL_CFLAGS | LOCAL_CFLAGS += -I<path> | 一個可選的設定,在編譯C/C++ source 時新增如Flags |
LOCAL_STATIC_LIBRARIES | 要連結到本模組的靜態庫list | |
LOCAL_SHARED_LIBRARIES | 要連結到本模組的動態庫 | |
LOCAL_LDLIBS | LOCAL_LDLIBS := -lz | 可以用它來新增系統庫 |