[Android]Android.mk學習(二)
import-module的功能
匯入外部模組的.mk檔案 ,和 include基本一樣。
概念上的區別是include匯入的是由我們自己寫的.mk。而import-module匯入的是外部庫、外部模組提供的.mk。
import-module的使用:$(call import-module,相對路徑)
include的路徑是.mk檔案的絕對路徑。
而import是設定的路徑指定到模組的.mk所在目錄,是相對於NDK_MODULE_PATH中的路徑列表的相對路徑。
NDK_MODULE_PATH的配置
NDK_MODULE_PATH是一個很重要的變數,當android.mk中使用了$(call import-module,XXX)函式引入外部庫檔案時會用到,用以指示該往哪裡去找這個檔案
- NDK_MODULE_PATH 是一個環境變數,不是android.mk中設定的變數。
- NDK_MODULE_PATH多個路徑用冒號分割。不是分號!且整個字串中間不能有空格。格式不正確也會報錯上面的錯誤的。
- 在import語句之前加入,$(call import-add-path,$(LOCAL_PATH)/platform/third_party/android/prebuilt) 將一個新的路徑加入NDK_MODULE_PATH變數。
LOCAL_SRC_FILES := hello-jni.c
LOCAL_SRC_FILES變數必須包含將要打包如模組的C/C++ 原始碼。
不必列出標頭檔案,build System 會自動幫我們找出依賴檔案。
預設的C++原始碼的副檔名為.cpp. 也可以修改,通過LOCAL_CPP_EXTENSION。
include $(CLEAR_VARS)
Android.mk中可以定義多個編譯模組,每個編譯模組都是以include $(CLEAR_VARS)開始以include $(BUILD_XXX)結束。
CLEAR_VARS由編譯系統提供,指定讓GNU MAKEFILE為你清除除LOCAL_PATH以外的所有LOCAL_XXX變數,
如LOCAL_MODULE,LOCAL_SRC_FILES,LOCAL_SHARED_LIBRARIES,LOCAL_STATIC_LIBRARIES等。
- include $(BUILD_STATIC_LIBRARY)表示編譯成靜態庫
- include $(BUILD_SHARED_LIBRARY)表示編譯成動態庫。
- include $(BUILD_EXECUTABLE)表示編譯成可執行程式
設定需要連結的動態庫
LOCAL_LDLIBS:=-Llibspath -lxxx -lyyy ... #libspath是庫所在路徑,xxx和yyy是庫
LOCAL_STATIC_LIBRARIES:
要連結到本模組的靜態庫list。
all-subdir-makefiles:
返回一個列表,包含'my-dir'中所有子目錄中的Android.mk。
例如: 結構如下:sources/foo/Android.mk sources/foo/lib1/Android.mk sources/foo/lib2/Android.mk
在If sources/foo/Android.mk 中, include $(call all-subdir-makefiles) 那則自動include 了sources/foo/lib1/Android.mk and sources/foo/lib2/Android.mk
LOCAL_C_INCLUDES
可選變數,表示標頭檔案的搜尋路徑。預設的標頭檔案的搜尋路徑是LOCAL_PATH目錄。
在編寫android.mk的過程中,免不了要修改LOCAL_C_INCLUDES來設定標頭檔案的include目錄, 一般寫成這樣
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes \
$(LOCAL_PATH)/../../Classes/game \
$(LOCAL_PATH)/../../Classes/logic \
$(LOCAL_PATH)/../../Classes/view
有一個目錄就要寫一行, 實在繁瑣, 有沒有寫法可以把原始碼目錄下的所有子目錄都引入呢, 看下面
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes
LOCAL_C_INCLUDES += $(shell ls -FR $(LOCAL_C_INCLUDES) | grep $(LOCAL_PATH)/$ )
LOCAL_C_INCLUDES := $(LOCAL_C_INCLUDES:$(LOCAL_PATH)/%:=$(LOCAL_PATH)/%)
即可把$(LOCAL_PATH)/../../Classes目錄和子目錄全部包含進來
LOCAL_CPP_EXTENSION
這是一個可選變數, 用來指定C++程式碼檔案的副檔名,預設是'.cpp',但是可以改變它,比如:LOCAL_CPP_EXTENSION := .cxx
LOCAL_CFLAGS
- 可選的編譯器選項,在編譯 C 程式碼檔案的時候使用。這可能是有用的,指定一個附加的包含路徑(相對於NDK的頂層目錄),巨集定義,或者編譯選項。
- LOCAL_CXXFLAGS: 與 LOCAL_CFLAGS同理,針對 C++原始檔。
- LOCAL_CPPFLAGS: 與 LOCAL_CFLAGS同理,但是對 C 和 C++ source files都適用。