一個(gè)Android.mk file用來(lái)向編譯系統(tǒng)描述你的源代碼。具體來(lái)說(shuō):該文件是GNU
Makefile的一小部分,,會(huì)被編譯系統(tǒng)解析一次或多次。你可以在每一個(gè)Android.mk
file中定義一個(gè)或多個(gè)模塊,你也可以在幾個(gè)模塊中使用同一個(gè)源代碼文件,。編譯系統(tǒng)為你處理許多細(xì)節(jié)問(wèn)題。例如,,你不需要在你的Android.mk中
列出頭文件和依賴(lài)文件,。NDK編譯系統(tǒng)將會(huì)為你自動(dòng)處理這些問(wèn)題,。這也意味著,在升級(jí)NDK后,,你應(yīng)該得到新的toolchain/platform支
持,,而且不需要改變你的Android.mk文件。 先看一個(gè)簡(jiǎn)單的例子:一個(gè)簡(jiǎn)單的"hello world",,比如下面的文件: sources/helloworld/helloworld.c sources/helloworld/Android.mk 相應(yīng)的Android.mk文件會(huì)象下面這樣: ---------- cut here ------------------ LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := helloworld LOCAL_SRC_FILES := helloworld.c include $(BUILD_SHARED_LIBRARY) ---------- cut here ------------------ 我們來(lái)解釋一下這幾行代碼: LOCAL_PATH := $(call my-dir) 一個(gè)Android.mk file首先必須定義好LOCAL_PATH變量,。它用于在開(kāi)發(fā)樹(shù)中查找源文件。在這個(gè)例子中,,宏函數(shù)’my-dir’, 由編譯系統(tǒng)提供,,用于返回當(dāng)前路徑(即包含Android.mk file文件的目錄)。 include $( CLEAR_VARS) CLEAR_VARS
由編譯系統(tǒng)提供,,指定讓GNU MAKEFILE為你清除許多LOCAL_XXX變量(例如 LOCAL_MODULE,
LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES, 等等...),除LOCAL_PATH
,。這是必要的,因?yàn)樗械木幾g控制文件都在同一個(gè)GNU MAKE執(zhí)行環(huán)境中,,所有的變量都是全局的,。 LOCAL_MODULE := helloworld LOCAL_MODULE變量必須定義,以標(biāo)識(shí)你在Android.mk文件中描述的每個(gè)模塊,。名稱(chēng)必須是唯一的,,而且不包含任何空格。注意編譯系統(tǒng)會(huì)自動(dòng)產(chǎn)生合適的前綴和后綴,,換句話說(shuō),,一個(gè)被命名為'foo'的共享庫(kù)模塊,將會(huì)生成'libfoo.so'文件,。 LOCAL_SRC_FILES := helloworld.c LOCAL_SRC_FILES變量必須包含將要編譯打包進(jìn)模塊中的C或C++源代碼文件,。注意,你不用在這里列出頭文件和包含文件,,因?yàn)榫幾g系統(tǒng)將會(huì)自動(dòng)為你找出依賴(lài)型的文件,;僅僅列出直接傳遞給編譯器的源代碼文件就好。
在Android中增加本地程序或者庫(kù),,這些程序和庫(kù)與其所載路徑?jīng)]有任何關(guān)系,,只和它們的Android.mk文件有關(guān)系。Android.mk和普通的Makefile有所不同,,它具有統(tǒng)一的寫(xiě)法,,主要包含一些系統(tǒng)公共的宏。 在一個(gè)Android.mk中可以生成多個(gè)可執(zhí)行程序,、動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù),。 1,編譯應(yīng)用程序的模板: #Test Exe LOCAL_PATH := $(call my-dir) #include $(CLEAR_VARS) LOCAL_SRC_FILES:= main.c LOCAL_MODULE:= test_exe #LOCAL_C_INCLUDES := #LOCAL_STATIC_LIBRARIES := #LOCAL_SHARED_LIBRARIES := include $(BUILD_EXECUTABLE) (菜
鳥(niǎo)級(jí)別解釋?zhuān)?=是賦值的意思,,$是引用某變量的值)LOCAL_SRC_FILES中加入源文件路徑,,LOCAL_C_INCLUDES
中加入所需要包含的頭文件路徑,,LOCAL_STATIC_LIBRARIES加入所需要鏈接的靜態(tài)庫(kù)(*.a)的名
稱(chēng),LOCAL_SHARED_LIBRARIES中加入所需要鏈接的動(dòng)態(tài)庫(kù)(*.so)的名稱(chēng),,LOCAL_MODULE表示模塊最終的名
稱(chēng),,BUILD_EXECUTABLE表示以一個(gè)可執(zhí)行程序的方式進(jìn)行編譯。 2,,編譯靜態(tài)庫(kù)的模板: #Test Static Lib LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_SRC_FILES:= \ helloworld.c LOCAL_MODULE:= libtest_static #LOCAL_C_INCLUDES := #LOCAL_STATIC_LIBRARIES := #LOCAL_SHARED_LIBRARIES := include $(BUILD_STATIC_LIBRARY) 一般的和上面相似,,BUILD_STATIC_LIBRARY表示編譯一個(gè)靜態(tài)庫(kù)。 3,,編譯動(dòng)態(tài)庫(kù)的模板: #Test Shared Lib LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_SRC_FILES:= \ helloworld.c LOCAL_MODULE:= libtest_shared TARGET_PRELINK_MODULES := false #LOCAL_C_INCLUDES := #LOCAL_STATIC_LIBRARIES := #LOCAL_SHARED_LIBRARIES := include $(BUILD_SHARED_LIBRARY) 一般的和上面相似,,BUILD_SHARED_LIBRARY表示編譯一個(gè)靜態(tài)庫(kù)。 以上三者的生成結(jié)果分別在如下,,generic依具體target會(huì)變: out/target/product/generic/obj/EXECUTABLE out/target/product/generic/obj/STATIC_LIBRARY out/target/product/generic/obj/SHARED_LIBRARY 每個(gè)模塊的目標(biāo)文件夾分別為: 可執(zhí)行程序:XXX_intermediates 靜態(tài)庫(kù): XXX_static_intermediates 動(dòng)態(tài)庫(kù): XXX_shared_intermediates 另外,,在Android.mk文件中,還可以指定最后的目標(biāo)安裝路徑,,用LOCAL_MODULE_PATH和LOCAL_UNSTRIPPED_PATH來(lái)指定,。不同的文件系統(tǒng)路徑用以下的宏進(jìn)行選擇: TARGET_ROOT_OUT:表示根文件系統(tǒng)。 TARGET_OUT:表示system文件系統(tǒng),。 TARGET_OUT_DATA:表示data文件系統(tǒng),。 用法如: CAL_MODULE_PATH:=$(TARGET_ROOT_OUT)
|