一. Android.mk介紹
Android.mk是Android提供的一種makefile文件肩钠,是GNU Makefile的一小部分,用來對(duì)Android程序進(jìn)行編譯兽间,指定諸如編譯生成so庫名历葛、引用的頭文件目錄、需要編譯的.c/.cpp文件和.a靜態(tài)庫文件渡八;因?yàn)樗械木幾g文件都在同一個(gè) GNU MAKE 執(zhí)行環(huán)境中進(jìn)行執(zhí)行啃洋,而Android.mk中所有的變量都是全局的传货。因此,您應(yīng)盡量少聲明變量宏娄,不要認(rèn)為某些變量在解析過程中不會(huì)被定義问裕。
它的基本格式如下:
1. LOCAL_PATH := $(call my-dir)
2. include $(CLEAR_VARS)
3. ................
4. LOCAL_xxx := xxx
5. LOCAL_MODULE := hello-jni
6. LOCAL_SRC_FILES := hello-jni.c
7. LOCAL_xxx := xxx
8. ................
9. include $(BUILD_SHARED_LIBRARY)
LOCAL_PATH
變量制定了該.mk的路徑,$(call my-dir)
調(diào)用NDK內(nèi)部的函數(shù)獲得當(dāng)前.mk文件的路徑
include $(CLEAR_VARS)
清空了除了LOCAL_PATH之外的所有LOCAL_xxx變量的值
省略號(hào)中間就是對(duì)于模塊參數(shù)的設(shè)置孵坚,主要包括:模塊名字粮宛、模塊源文件、模塊類型卖宠、編譯好的模塊存放位置巍杈、以及編譯的平臺(tái)等
include $(BUILD_xxx_xxx)
執(zhí)行NDK的默認(rèn)腳本,它會(huì)收include $(CLEAR_VARS)
腳本后所有定義的LOCAL_xxx變量扛伍,然后根據(jù)它們來生成模塊筷畦。
二.Android.mk語法詳解
LOCAL_PATH := $(call my-dir)
每個(gè)Android.mk文件必須以定義LOCAL_PATH為開始。它用于在開發(fā)tree中查找源文件刺洒。宏my-dir 則由Build System提供鳖宾。返回包含Android.mk的目錄路徑。
include $(CLEAR_VARS)
CLEAR_VARS 變量由Build System提供逆航。并指向一個(gè)指定的GNU Makefile鼎文,由它負(fù)責(zé)清理很多LOCAL_xxx.
例如:LOCAL_MODULE, LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES等等。但不清理LOCAL_PATH.
這個(gè)清理動(dòng)作是必須的因俐,因?yàn)樗械木幾g控制文件由同一個(gè)GNU Make解析和執(zhí)行拇惋,其變量是全局的。所以清理后才能避免相互影響抹剩。
LOCAL_MODULE := hello-jni
LOCAL_MODULE模塊必須定義撑帖,以表示Android.mk中的每一個(gè)模塊。名字必須唯一且不包含空格澳眷。Build System會(huì)自動(dòng)添加適當(dāng)?shù)那熬Y和后綴磷仰。例如,foo境蔼,要產(chǎn)生動(dòng)態(tài)庫灶平,則生成libfoo.so. 但請(qǐng)注意:如果模塊名被定為:libfoo.則生成libfoo.so. 不再加前綴
LOCAL_MODULE_PATH :=$(TARGET_ROOT_OUT) 指定最后生成的模塊的目標(biāo)地址
1.TARGET_ROOT_OUT:根文件系統(tǒng),路徑為out/target/product/generic/root
2.TARGET_OUT:system文件系統(tǒng)箍土,路徑為out/target/product/generic/system
3.TARGET_OUT_DATA:data文件系統(tǒng)逢享,路徑為out/target/product/generic/data
除了上面的這些,NDK還提供了很多其他的TARGET_XXX_XXX變量吴藻,用于將生成的模塊拷貝到輸出目錄的不同路徑
默認(rèn)是TARGET_OUT
LOCAL_SRC_FILES := hello-jni.c
LOCAL_SRC_FILES變量必須包含將要打包如模塊的C/C++ 源碼瞒爬。不必列出頭文件,build System 會(huì)自動(dòng)幫我們找出依賴文件。缺省的C++源碼的擴(kuò)展名為.cpp. 也可以修改侧但,通過LOCAL_CPP_EXTENSION
include $(BUILD_SHARED_LIBRARY)
BUILD_SHARED_LIBRARY:
是Build System提供的一個(gè)變量矢空,指向一個(gè)GNU Makefile Script。
它負(fù)責(zé)收集自從上次調(diào)用 include $(CLEAR_VARS) 后的所有LOCAL_XXX信息禀横。并決定編譯為什么屁药。
BUILD_STATIC_LIBRARY :編譯為靜態(tài)庫。
BUILD_SHARED_LIBRARY :編譯為動(dòng)態(tài)庫
BUILD_EXECUTABLE :編譯為Native C可執(zhí)行程序
BUILD_PREBUILT :該模塊已經(jīng)預(yù)先編譯
NDK還定義了很多其他的BUILD_XXX_XXX變量柏锄,它們用來指定模塊的生成方式酿箭。
三、使用示例
1. 編譯靜態(tài)庫
1. LOCAL_PATH := $(call my-dir)
2. include $(CLEAR_VARS)
3. LOCAL_MODULE = libhellos
4. LOCAL_CFLAGS = $(L_CFLAGS)
5. LOCAL_SRC_FILES = hellos.c
6. LOCAL_C_INCLUDES = $(INCLUDES)
7. LOCAL_SHARED_LIBRARIES := libcutils
8. LOCAL_COPY_HEADERS_TO := libhellos
9. LOCAL_COPY_HEADERS := hellos.h
10. include $(BUILD_STATIC_LIBRARY)
2. 編譯動(dòng)態(tài)庫
1. LOCAL_PATH := $(call my-dir)
2. include $(CLEAR_VARS)
3. LOCAL_MODULE = libhellod
4. LOCAL_CFLAGS = $(L_CFLAGS)
5. LOCAL_SRC_FILES = hellod.c
6. LOCAL_C_INCLUDES = $(INCLUDES)
7. LOCAL_SHARED_LIBRARIES := libcutils
8. LOCAL_COPY_HEADERS_TO := libhellod
9. LOCAL_COPY_HEADERS := hellod.h
10. include $(BUILD_SHARED_LIBRARY)
3. 使用靜態(tài)庫
1. LOCAL_PATH := $(call my-dir)
2. include $(CLEAR_VARS)
3. LOCAL_MODULE := hellos
4. LOCAL_STATIC_LIBRARIES := libhellos
5. LOCAL_SHARED_LIBRARIES :=
6. LOCAL_LDLIBS += -ldl
7. LOCAL_CFLAGS := $(L_CFLAGS)
8. LOCAL_SRC_FILES := mains.c
9. LOCAL_C_INCLUDES := $(INCLUDES)
10. include $(BUILD_EXECUTABLE)
**4. 使用動(dòng)態(tài)庫 **
1. LOCAL_PATH := $(call my-dir)
2. include $(CLEAR_VARS)
3. LOCAL_MODULE := hellod
4. LOCAL_MODULE_TAGS := debug
5. LOCAL_SHARED_LIBRARIES := libc libcutils libhellod
6. LOCAL_LDLIBS += -ldl
7. LOCAL_CFLAGS := $(L_CFLAGS)
8. LOCAL_SRC_FILES := maind.c
9. LOCAL_C_INCLUDES := $(INCLUDES)
10. include $(BUILD_EXECUTABLE)
5. 拷貝文件到指定目錄
1. LOCAL_PATH := $(call my-dir)
2. include $(CLEAR_VARS)
3. LOCAL_MODULE := bt_vendor.conf
4. LOCAL_MODULE_CLASS := ETC
5. LOCAL_MODULE_PATH := $(TARGET_OUT)/etc/bluetooth
6. LOCAL_MODULE_TAGS := eng
7. LOCAL_SRC_FILES := $(LOCAL_MODULE)
8. include $(BUILD_PREBUILT)
6. 拷貝動(dòng)態(tài)庫到指定目錄
1. LOCAL_PATH := $(call my-dir)
2. include $(CLEAR_VARS)
3. #the data or lib you want to copy
4. LOCAL_MODULE := libxxx.so
5. LOCAL_MODULE_CLASS := SHARED_LIBRARIES
6. LOCAL_MODULE_PATH :=
$$(ANDROID_OUT_SHARED_LIBRARIES)
7. LOCAL_SRC_FILES := lib/$(LOCAL_MODULE )
8. OVERRIDE_BUILD_MODULE_PATH :=
$(TARGET_OUT_INTERMEDIATE_LIBRARIES)
9. include $(BUILD_PREBUILT)