quick cocos 或者 Cocos2dx 項目下的Android.mk檔案的學習

來源:互聯網
上載者:User

標籤: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,

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.