1. 程式人生 > >Android編譯系統(android.mk)

Android編譯系統(android.mk)

四.模組描述變數
下面的變數用於向編譯系統描述你的模組。你應該定義在'include  $(CLEAR_VARS)'和'include $(BUILD_XXXXX)'之間。正如前面描寫的那樣,$(CLEAR_VARS)是一個指令碼,清除所有這些變數

(1) LOCAL_PATH:  這個變數用於給出當前檔案的路徑。必須在 Android.mk 的開頭定義,可以這樣使用:LOCAL_PATH := $(call my-dir)  這個變數不會被$(CLEAR_VARS)清除,因此每個 Android.mk 只需要定義一次(即使在一個檔案中定義了幾個模組的情況下)。

(2)LOCAL_MODULE: 這是模組的名字,它必須是唯一的,而且不能包含空格。必須在包含任一的$(BUILD_XXXX)指令碼之前定義它。模組的名字決定了生成檔案的名字。例如,如果一個一個共享庫模組的名字是,那麼生成檔案的名字就是 lib.so。但是,在的 NDK 生成檔案中(或者 Android.mk 或者 Application.mk),應該只涉及(引用)有正常名字的其他模組。


(3)LOCAL_SRC_FILES:  這是要編譯的原始碼檔案列表。只要列出要傳遞給編譯器的檔案,因為編譯系統自動計算依賴。注意原始碼檔名稱都是相對於 LOCAL_PATH的,你可以使用路徑部分,例如
LOCAL_SRC_FILES := foo.c toto/bar.c\
Hello.c
 檔案之間可以用空格或Tab鍵進行分割,換行請用"\".如果是追加原始碼檔案的話,請用LOCAL_SRC_FILES +=
注意:在生成檔案中都要使用UNIX風格的斜槓(/).windows風格的反斜槓不會被正確的處理。
注意:可以LOCAL_SRC_FILES := $(call all-subdir-java-files)這種形式來包含local_path目錄下的所有java檔案。


  (4) LOCAL_CPP_EXTENSION:  這是一個可選變數, 用來指定C++程式碼檔案的副檔名,預設是'.cpp',但是可以改變它,比如:
LOCAL_CPP_EXTENSION := .cxx

  (5) LOCAL_C_INCLUDES:  可選變數,表示標頭檔案的搜尋路徑。預設的標頭檔案的搜尋路徑是LOCAL_PATH目錄
  示例:LOCAL_C_INCLUDES := sources/foo或LOCAL_C_INCLUDES := $(LOCAL_PATH)/../foo
  LOCAL_C_INCLUDES需要在任何包含LOCAL_CFLAGS/LOCAL_CPPFLAGS標誌之前進行設定。


  (6)LOCAL_CFLAGS:  可選的編譯器選項,在編譯 C 程式碼檔案的時候使用。這可能是有
用的,指定一個附加的包含路徑(相對於NDK的頂層目錄),巨集定義,或者編譯選項
  注意:不要在 Android.mk 中改變 optimization/debugging 級別,只要在 Application.mk 中指定合適的資訊,就會自動地為你處理這個問題,在除錯期間,會讓 NDK自動生成有用的資料檔案

  (7)LOCAL_CXXFLAGS與 LOCAL_CFLAGS同理,針對 C++原始檔

  (8)LOCAL_CPPFLAGS:  與 LOCAL_CFLAGS同理,但是對 C 和 C++ source files都適用。

  (9)LOCAL_STATIC_LIBRARIES: 表示該模組需要使用哪些靜態庫,以便在編譯時進行連結。

  (10)LOCAL_SHARED_LIBRARIES表示模組在執行時要依賴的共享庫(動態庫),在連結時就需要,以便在生成檔案時嵌入其相應的資訊。注意:它不會附加列出的模組到編譯圖,也就是仍然需要在Application.mk 中把它們新增到程式要求的模組中

  (11)LOCAL_LDLIBS: 編譯模組時要使用的附加的連結器選項。這對於使用‘-l’字首傳遞指定庫的名字是有用的。
例如,LOCAL_LDLIBS := -lz表示告訴連結器生成的模組要在載入時刻連結到/system/lib/libz.so
  可檢視 docs/STABLE-APIS.TXT 獲取使用 NDK發行版能連結到的開放的系統庫列表

  (12) LOCAL_ALLOW_UNDEFINED_SYMBOLS預設情況下, 在試圖編譯一個共享庫時,任何未定義的引用將導致一個“未定義的符號”錯誤。這對於在原始碼檔案中捕捉錯誤會有很大的幫助。然而,如果因為某些原因,需要不啟動這項檢查,可把這個變數設為‘true’。
注意相應的共享庫可能在執行時載入失敗。(這個一般儘量不要去設為 true)。

  (13) LOCAL_ARM_MODE: 預設情況下, arm目標二進位制會以 thumb 的形式生成(16 位),你可以通過設定這個變數為 arm如果你希望你的 module 是以 32 位指令的形式。
'arm' (32-bit instructions) mode. E.g.:
LOCAL_ARM_MODE := arm
注意:可以在編譯的時候告訴系統針對某個原始碼檔案進行特定的型別的編譯
比如,LOCAL_SRC_FILES := foo.c bar.c.arm  這樣就告訴系統總是將 bar.c 以arm的模式編譯。

(14)LOCAL_MODULE_PATH 和 LOCAL_UNSTRIPPED_PATH
在 Android.mk 檔案中, 還可以用LOCAL_MODULE_PATH 和LOCAL_UNSTRIPPED_PATH指定最後的目標安裝路徑.
不同的檔案系統路徑用以下的巨集進行選擇
TARGET_ROOT_OUT:表示根檔案系統。
TARGET_OUT:表示 system檔案系統。
 TARGET_OUT_DATA:表示 data檔案系統。
用法如:LOCAL_MODULE_PATH :=$(TARGET_ROOT_OUT) 
至於LOCAL_MODULE_PATH 和LOCAL_UNSTRIPPED_PATH的區別,暫時還不清楚