標籤:android des style blog http java
android.mk檔案的作用:編譯需要的cpp檔案,產生.so動態庫,供android端調用。
先上一個android.mk檔案:
第一次建立項目,在Android平台編譯時間,都需要通過android.mk檔案編譯整個cocos2dx的庫(第一次編譯我們需要等待很長的時間.....)。
首Crowdsourced Security Testing道$(call import-module,dir_name)的作用,然後順著lib/proj.android目錄繼續找對應目錄下的android.mk檔案
類似於遞迴一樣,把所有目錄下的android.mk檔案都編譯一次,最終把Cocos2dx庫和自己的cpp檔案打包成.so檔案。
1)LOCAL_WHOLE_STATIC_LIBRARIES := quickcocos2dx
上面這句意思是包含quickcocos2dx的靜態庫,但是where is quickcocos2dx 的靜態庫呢?
移步進D:\quick-x\quick-cocos2d-x\lib\proj.android,查看該目錄下的android.mk檔案,大概內容如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := quickcocos2dx #庫名
LOCAL_MODULE_FILENAME := libquickcocos2dx
....
....
include $(BUILD_STATIC_LIBRARY) #編譯靜態quickcocos2dx庫
$(call import-module,cocos2dx) #繼續編譯cocos2dx目錄下的android.mk檔案
$(call import-module,CocosDenshion/android) #繼續編譯CocosDenshion/android目錄下的android.mk檔案
$(call import-module,extensions) #繼續編譯extensions目錄下的android.mk檔案
$(call import-module,scripting/lua/proj.android) #繼續編譯scripting/lua/proj.android目錄下的android.mk檔案
...
...
從上面的android.mk可以看到,quickcocos2dx 的靜態庫就是這個。
就這樣,通過不斷的編譯android.mk檔案,將cocos2dx的幾個靜態庫產生,最終產生了目標的.so動態庫。
這樣,在android平台下,可以使用jni調用cocos2dx的庫,這樣就可以在手機上玩遊戲了。
2)LOCAL_MODULE 跟 LOCAL_MODULE_FILENAME的區別
看具體的代碼:
LOCAL_MODULE := quickcocos2dx
LOCAL_MODULE_FILENAME := libquickcocos2dx
上面兩句代碼,我的理解:
在android.mk檔案編譯的過程中,
使用的名字是quickcocos2dx(android.mk運行期使用的變數名,其它的mk檔案可以通過quickcocos2dx來引用這個MODULE),
但是當編譯完成,儲存到外存,也就是硬碟上時(LOCAL_MODULE_FILENAME),使用的名字是:libquickcocos2dx
網上關於android.mk的文檔一大把,推薦個講的不錯的,給我撥雲見月的blog:
http://www.cnblogs.com/yaozhongxiao/archive/2012/03/06/2382362.html
並摘錄些實用的文字:
++++++++++++++++++++++++++分割線++++++++++++++++++++++++++++++
1. Android編譯系統分析 --- 系統變數解析
LOCAL_PATH - 編譯時間的目錄
LOCAL_MODULE - 編譯的目標對象
LOCAL_SRC_FILES - 編譯的源檔案
LOCAL_C_INCLUDES - 需要包含的標頭檔目錄
LOCAL_SHARED_LIBRARIES - 連結時需要的外部庫
LOCAL_PRELINK_MODULE - 是否需要prelink處理
BUILD_STATIC_LIBRARY - 指明要編譯成靜態庫
BUILD_SHARED_LIBRARY - 指明要編譯成動態庫
(1). LOCAL_PATH - 編譯時間的目錄
$(call 目錄,目錄….) 目錄引入操作符: 如該目錄下有個檔案夾名稱 src,則可以這樣寫 $(call src),那麼就會得到 src 目錄的完整路徑
(2). include $(CLEAR_VARS) -清除之前的一些系統變數
CLEAR_VARS:= $(BUILD_SYSTEM)/clear_vars.mk
在 build/core/config.mk 定義 CLEAR_VARS:= $(BUILD_SYSTEM)/clear_vars.mk
通過include 包含自訂的.mk檔案(即是自訂編譯規則)或是引用系統其他的.mk檔案(系統定義的編譯規則)。
(3). LOCAL_SRC_FILES - 編譯的源檔案
可以是.c, .cpp, .java, .S(彙編檔案)或是.aidl等格式, 不同的檔案用空格隔開。
如果編譯目錄子目錄,採用相對路徑,如子目錄/檔案名稱。
也可以通過$(call 目錄),指明編譯某目錄下所有.c/.cpp/.java/.S/ .aidl檔案. 追加檔案 LOCAL_SRC_FILES += 檔案
(4). LOCAL_C_INCLUDES - 需要包含的標頭檔目錄
可以是系統定義路徑,也可以是相對路徑. 如該編譯目錄下有個include目錄,寫法是include/*.h
(5). LOCAL_MODULE - 編譯的目標對象
module 是指系統的 native code,通常針對c,c++代碼
./system/core/sh/Android.mk:32:LOCAL_MODULE:= sh
./system/core/libcutils/Android.mk:71:LOCAL_MODULE := libcutils
(6). LOCAL_PACKAGE_NAME
Java 應用程式的名字用該變數定義
./packages/apps/Music/Android.mk:9:LOCAL_PACKAGE_NAME := Music
./packages/apps/Browser/Android.mk:14:LOCAL_PACKAGE_NAME := Browser
(7). 依賴庫
LOCAL_SHARED_LIBRARIES - 連結時需要的外部共用庫
LOCAL_STATIC_LIBRARIES - 連結時需要的外部外部靜態
LOCAL_JAVA_LIBRARIES 加入jar包
(8). BUILD_SHARED_LIBRARY - 指明要編譯成動態庫。編譯的目標,用include 操作符
BUILD_STATIC_LIBRARY --- 來指明要編譯成靜態庫。
如果是java檔案的話,用 BUILD_PACKAGE 來指明。會用到系統的編譯指令碼host_java_library.mk,