1. 程式人生 > >[Android]Android.mk學習(二)

[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)函式引入外部庫檔案時會用到,用以指示該往哪裡去找這個檔案

  1. NDK_MODULE_PATH 是一個環境變數,不是android.mk中設定的變數。
  2. NDK_MODULE_PATH多個路徑用冒號分割。不是分號!且整個字串中間不能有空格。格式不正確也會報錯上面的錯誤的。
  3. 在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等。

  1. include $(BUILD_STATIC_LIBRARY)表示編譯成靜態庫
  2. include $(BUILD_SHARED_LIBRARY)表示編譯成動態庫。
  3. 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都適用。

[Android]Android.mk學習