什么是Android.mk
Android.mk是Android提供的一種makefile文件,用來(lái)指定諸如編譯生成so庫(kù)名、引用的頭文件目錄、需要編譯的.c/.cpp文件和.a靜態(tài)庫(kù)文件等。
Android.mk文件用來(lái)告知NDK Build系統(tǒng)關(guān)于Source的信息。 Android.mk將是GNU Makefile的一部分,且將被Build System解析一次或多次。
所以,請(qǐng)盡量少的在Android.mk中聲明變量,也不要假定任何東西不會(huì)在解析過(guò)程中定義。
什么是NDK
Android NDK(Native Development Kit )是一套工具集合,允許你用像C/C++語(yǔ)言那樣實(shí)現(xiàn)應(yīng)用程序的一部分。

Android.mk文件語(yǔ)法允許我們將Source打包成一個(gè)"modules". modules可以是:
1. 靜態(tài)庫(kù)
2. 動(dòng)態(tài)庫(kù)
基本語(yǔ)法:
Simple example
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hello-jni
LOCAL_SRC_FILES := hello-jni.c
include $(BUILD_SHARED_LIBRARY)
語(yǔ)法介紹
現(xiàn)在,讓我們解釋一下這些行。
LOCAL_PATH
LOCAL_PATH := $(call my-dir)
android.mk文件必須以本地路徑變量的定義開(kāi)始。
它用于在開(kāi)發(fā)樹(shù)中定位源文件。在本例中,由構(gòu)建系統(tǒng)提供的宏函數(shù)'my dir'用于返回當(dāng)前目錄的路徑(即包含android.mk文件本身的目錄)。
CLEAR_VARS
include $(CLEAR_VARS)
clear_vars變量由構(gòu)建系統(tǒng)提供,并指向一個(gè)特殊的GNU makefile,它將為您清除許多LOCAL_xxx變量。例如LOCAL_MODULE、OCAL_SRC_FILES、LOCAL_STATIC_LIBRARIES等),LOCAL_PATH除外。
這是必需的,因?yàn)樗械臉?gòu)建控制文件在一個(gè)gnu make執(zhí)行上下文中解析,其中所有變量都是全局的。
LOCAL_MODULE
LOCAL_MODULE := hello-jni
必須定義LOCAL_MODULE變量以標(biāo)識(shí)您在android.mk中描述的每個(gè)模塊。
名稱(chēng)必須是唯一且不包含任何空間。
請(qǐng)注意,構(gòu)建系統(tǒng)將自動(dòng)向相應(yīng)生成的文件添加適當(dāng)?shù)那熬Y和后綴。換言之,名為“foo”的共享庫(kù)模塊將生成“l(fā)ibfoo.so”。
如果您將模塊命名為“l(fā)ibfoo”,則生成系統(tǒng)不會(huì)添加另一個(gè)“l(fā)ib”前綴,也會(huì)生成libfoo.so。
LOCAL_SRC_FILES
LOCAL_SRC_FILES := hello-jni.c
LOCAL_SRC_FILES變量必須包含C和/或C++源文件的列表,這些文件將被構(gòu)建并組裝到模塊中。
注意你應(yīng)該這里不列出頭文件和包含的文件,因?yàn)闃?gòu)建系統(tǒng)將自動(dòng)為您計(jì)算依賴(lài)項(xiàng);只列出源文件這將直接傳遞給編譯器。
注意,C++源文件的默認(rèn)擴(kuò)展名是“.CPP”。但是,可以通過(guò)定義變量LOCAL_CPP_EXTENSION來(lái)指定不同的變量本地?cái)U(kuò)展名。不要忘記初始點(diǎn)(即“.cxx”有效,而不是“cxx”)。
LOCAL_SRC_FILES
include $(BUILD_SHARED_LIBRARY)
BUILD_SHARED_LIBRARY是由構(gòu)建系統(tǒng)提供的一個(gè)變量,它指向負(fù)責(zé)收集所有自最新“include$(clear_vars)”以來(lái),您在本地變量中定義的信息,并確定要構(gòu)建什么以及如何構(gòu)建。
當(dāng)然還有BUILD_STATIC_LIBRARY來(lái)生成靜態(tài)庫(kù)。
具體的編譯變量列舉:
| type | describe |
|---|---|
| BUILD_STATIC_LIBRARY | 編譯為靜態(tài)庫(kù)。 |
| BUILD_SHARED_LIBRARY | 編譯為動(dòng)態(tài)庫(kù) |
| BUILD_EXECUTABLE | 編譯為Native C可執(zhí)行程序 |
NDK語(yǔ)法變量匯總
NDK Build System 保留以下變量名:
- 以LOCAL_ 為開(kāi)頭的
- 以PRIVATE_ ,NDK_ 或者APP_ 開(kāi)頭的名字。
- 小寫(xiě)字母名字:如my-dir
如果想要定義自己在Android.mk中使用的變量名,建議添加MY_前綴。
| type | example | describ |
|---|---|---|
| CLEAR_VARS | include $(CLEAR_VARS) | 必須在新模塊前包含之 |
| BUILD_SHARED_LIBRARY | include $(BUILD_SHARED_LIBRARY) | 決定如何將你列出的Source編譯成一個(gè)動(dòng)態(tài)庫(kù) |
| BUILD_STATIC_LIBRARY | include $(BUILD_STATIC_LIBRARY) | 決定如何將你列出的Source編譯成一個(gè)靜態(tài)庫(kù) |
| BUILD_EXECUTABLE | 決定如何將你列出的Source編譯成一個(gè)可執(zhí)行Native程序 | include $(BUILD_EXECUTABLE) |
| PREBUILT_SHARED_LIBRARY | include $(PREBUILT_SHARED_LIBRARY) | 把這個(gè)共享庫(kù)聲明為 “一個(gè)” 獨(dú)立的模塊 |
| PREBUILT_STATIC_LIBRARY | include $(PREBUILT_STATIC_LIBRARY) | 把這個(gè)靜態(tài)庫(kù)庫(kù)聲明為 “一個(gè)” 獨(dú)立的模塊 |
| TARGET_ARCH | 目標(biāo)CPU架構(gòu)名 | |
| TARGET_PLATFORM | 目標(biāo)平臺(tái)的名字 | |
| TARGET_ARCH_ABI | ||
| LOCAL_C_INCLUDES | LOCAL_C_INCLUDES := sources/foo | 一個(gè)可選的path列表。 |
| LOCAL_CFLAGS | LOCAL_CFLAGS += -I<path> | 一個(gè)可選的設(shè)置,在編譯C/C++ source 時(shí)添加如Flags |
| LOCAL_STATIC_LIBRARIES | 要鏈接到本模塊的靜態(tài)庫(kù)list | |
| LOCAL_SHARED_LIBRARIES | 要鏈接到本模塊的動(dòng)態(tài)庫(kù) | |
| LOCAL_LDLIBS | LOCAL_LDLIBS := -lz | 可以用它來(lái)添加系統(tǒng)庫(kù) |
參考:
android編譯系統(tǒng)makefile(Android.mk)寫(xiě)法
Android.mk 文件語(yǔ)法詳解
Android.mk