模塊描述變量: 下面的變量用于向編譯系統(tǒng)描述你的模塊。你應(yīng)該定義在'include $(CLEAR_VARS)'和'include $(BUILD_XXXXX)'之間定義。正如前面描寫的那樣,,$(CLEAR_VARS是一個(gè)腳本,,清除所有這些變量,除非在描述中顯式注明,。
LOCAL_PATH 這個(gè)變量用于給出當(dāng)前文件的路徑,。你必須在Android.mk的開頭定義,可以這樣使用:
LOCAL_PATH := $(call my-dir) 這個(gè)變量不會(huì)被$(CLEAR_VARS)清除,,因此每個(gè)Android.mk只需要定義一次(即使你在一個(gè)文件中定義了幾個(gè)模塊的情況下),。
LOCAL_MODULE 這是你模塊的名字,它必須是唯一的,,而且不能包含空格,。你必須在包含任一的$(BUILD_XXXX)腳本之前定義它。模塊的名字決定了生成文件的 名字,,例如,,如果一個(gè)一個(gè)共享庫模塊的名字是<foo>,那么生成文件的名字就是lib<foo>.so,。但是,,在你的NDK生 成文件中(或者Android.mk或者Application.mk),你應(yīng)該只涉及(引用)有正常名字的其他模塊,。
LOCAL_SRC_FILES 這是要編譯的源代碼文件列表,。只要列出要傳遞給編譯器的文件,因?yàn)榫幾g系統(tǒng)自動(dòng)為你計(jì)算依賴,。 注意源代碼文件名稱都是相對(duì)于LOCAL_PATH的,,你可以使用路徑部分,例如: LOCAL_SRC_FILES := foo.c \ toto/bar.c 注意:在生成文件中都要使用UNIX風(fēng)格的斜杠(/).windows風(fēng)格的反斜杠不會(huì)被正確的處理,。
LOCAL_CPP_EXTENSION 這是一個(gè)可選變量,,用來指定C++代碼文件的擴(kuò)展名,默認(rèn)是'.cpp',但是你可以改變它,,比如: LOCAL_CPP_EXTENSION := .cxx
LOCAL_C_INCLUDES 路徑的可選配置,,是從根目錄開始的, all sources (C, C++ and Assembly). For example: LOCAL_C_INCLUDES := sources/foo Or even: LOCAL_C_INCLUDES := $(LOCAL_PATH)/../foo 需要在任何包含LOCAL_CFLAGS / LOCAL_CPPFLAGS標(biāo)志之前,。
LOCAL_CFLAGS 可選的編譯器選項(xiàng),,在編譯C代碼文件的時(shí)候使用。 這可能是有用的,,指定一個(gè)附加的包含路徑(相對(duì)于NDK的頂層目錄),,宏定義,,或者編譯選項(xiàng),。 重要信息:不要在Android.mk中改變optimization/debugging級(jí)別,只要在Application.mk中指定合適的信息,就會(huì)自動(dòng)地為你處理這個(gè)問題,,在調(diào)試期間,,會(huì)讓NDK自動(dòng)生成有用的數(shù)據(jù)文件。
LOCAL_CXXFLAGS Same as LOCAL_CFLAGS for C++ source files
LOCAL_CPPFLAGS 與LOCAL_CFLAGS相同,,但是對(duì)C 和 C++ source files都適用,。
LOCAL_STATIC_LIBRARIES 應(yīng)該鏈接到這個(gè)模塊的靜態(tài)庫列表(使用BUILD_STATIC_LIBRARY生成),這僅僅對(duì)共享庫模塊才有意義,。
LOCAL_SHARED_LIBRARIES 這個(gè)模塊在運(yùn)行時(shí)要依賴的共享庫模塊列表,,在鏈接時(shí)需要,在生成文件時(shí)嵌入的相應(yīng)的信息,。注意:這不會(huì)附加列出的模塊到編譯圖,,也就是,你仍然需要在Application.mk中把它們添加到程序要求的模塊中,。
LOCAL_LDLIBS 編譯你的模塊要使用的附加的鏈接器選項(xiàng),。這對(duì)于使用”-l”前綴傳遞指定庫的名字是有用的。例如,,下面將告訴鏈接器生成的模塊要在加載時(shí)刻鏈接到/system/lib/libz.so LOCAL_LDLIBS := -lz 看docs/STABLE-APIS.TXT獲取你使用NDK發(fā)行版能鏈接到的開放的系統(tǒng)庫列表,。
LOCAL_ALLOW_UNDEFINED_SYMBOLS 默認(rèn)情況下,在試圖編譯一個(gè)共享庫時(shí),,任何未定義的引用將導(dǎo)致一個(gè)“未定義的符號(hào)”錯(cuò)誤,。這對(duì)于在你的源代碼文件中捕捉錯(cuò)誤會(huì)有很大的幫助。 然而,,如果你因?yàn)槟承┰?,需要不啟?dòng)這項(xiàng)檢查,把這個(gè)變量設(shè)為‘true’,。注意相應(yīng)的共享庫可能在運(yùn)行時(shí)加載失敗,。(這個(gè)一般盡量不要去設(shè)為true)
LOCAL_ARM_MODE 默認(rèn)情況下,arm目標(biāo)二進(jìn)制會(huì)以thumb的形式生成(16位),,你可以通過設(shè)置這個(gè)變量為arm如果你希望你的module是以32位指令的形式,。 'arm' (32-bit instructions) mode. E.g.: LOCAL_ARM_MODE := arm 注意你同樣可以在編譯的時(shí)候告訴系統(tǒng)編譯特定的類型,比如 LOCAL_SRC_FILES := foo.c bar.c.arm 這樣就告訴系統(tǒng)總是將bar.c以arm的模式編譯,,
Android.mk使用模板 在一個(gè)Android.mk中可以生成多個(gè)可執(zhí)行程序,、動(dòng)態(tài)庫和靜態(tài)庫。 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) (菜鳥級(jí)別解釋::=是賦值的意思,,$是引用某變量的值)LOCAL_SRC_FILES中加入源文件路徑,LOCAL_C_INCLUDES 中加入所需要包含的頭文件路徑,,LOCAL_STATIC_LIBRARIES加入所需要鏈接的靜態(tài)庫(*.a)的名 稱,,LOCAL_SHARED_LIBRARIES中加入所需要鏈接的動(dòng)態(tài)庫(*.so)的名稱,LOCAL_MODULE表示模塊最終的名 稱,BUILD_EXECUTABLE表示以一個(gè)可執(zhí)行程序的方式進(jìn)行編譯,。 2,,編譯靜態(tài)庫的模板: #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)庫,。 3,,編譯動(dòng)態(tài)庫的模板: #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è)共享庫,。
以上三者的生成結(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)庫: XXX_static_intermediates 動(dòng)態(tài)庫: XXX_shared_intermediates 另外,在Android.mk文件中,,還可以指定最后的目標(biāo)安裝路徑,,用LOCAL_MODULE_PATH和LOCAL_UNSTRIPPED_PATH來指定。不同的文件系統(tǒng)路徑用以下的宏進(jìn)行選擇: TARGET_ROOT_OUT:表示根文件系統(tǒng),。 TARGET_OUT:表示system文件系統(tǒng),。 TARGET_OUT_DATA:表示data文件系統(tǒng)。 用法如: LOCAL_MODULE_PATH:=$(TARGET_ROOT_OUT) |
|