1. 程式人生 > >ndk開發中的Android.mk檔案與Application.mk詳解及例項

ndk開發中的Android.mk檔案與Application.mk詳解及例項

Android.mk檔案的作用

An Android.mk file is written to describe your sources to the build system.

中文意思是:寫一個Android.mk檔案是為了向生成系統描述你的原始碼。

Application.mk檔案的作用:

The purpose of Application.mk is to describe which native 'modules' (i.e. static/shared libraries) are needed by your application.An Application.mk file is usually placed under $PROJECT/jni/Application.mk, where $PROJECT points to your application's project directory.

    中文意思是:Application.mk用來描述你的工程下的native模組, 一般放在$PROJECT/jni/Application.mk, 其中$PROJECT表示你的工程目錄,這樣就可以被ndk-build指令碼檔案找到.(注:在這種方式下,進入jni目錄,即$PROJECT/jni/,然後執行ndk-build,就可以直接編譯jni生成.so檔案了).

上面就簡單的描述了Android.mk和Application.mk的檔案的作用,下面拿Cocos2d-x中最簡單的例子來簡單介紹一下這兩個檔案。

筆者在cocos2d-x-2.2.3\projects下建立了一個Test專案,匯入proj.android到Eclipse中,會發現有如下的檔案目錄結構:


在jni資料夾下有這兩個檔案,我們開啟可以看到以下程式碼,筆者加上對應的註釋了:

/Test/jni/Android.mk

  1. #1.這個變數用於給出當前檔案的路徑,my-dir返回當前Android.mk所在目錄的路徑  
  2. LOCAL_PATH := $(call my-dir)  
  3. #2.CLEAR_VARS:指向一個編譯指令碼。這個必須在開始一個新模組之前包含  
  4. include $(CLEAR_VARS)  
  5. #3.這個模組的名字,它必須是唯一的,而且不能包含空格  
  6. LOCAL_MODULE := cocos2dcpp_shared  
  7. #4.設定你的模組的二進位制檔案的名稱,獨立於LOCAL_MODULE  
  8. LOCAL_MODULE_FILENAME := libcocos2dcpp  
  9. #5.這是要編譯的原始碼檔案列表  
  10. LOCAL_SRC_FILES := hellocpp/main.cpp \  
  11.                    ../../Classes/AppDelegate.cpp \  
  12.                    ../../Classes/HelloWorldScene.cpp  
  13. #6.可選變數,表示標頭檔案的搜尋路徑  
  14. LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes  
  15. #7.LOCAL_WHOLE_STATIC_LIBRARIES會載入整個靜態庫,LOCAL_STATIC_LIBRARIES只是載入靜態庫中用到的函式。  
  16. LOCAL_WHOLE_STATIC_LIBRARIES += cocos2dx_static  
  17. LOCAL_WHOLE_STATIC_LIBRARIES += cocosdenshion_static  
  18. LOCAL_WHOLE_STATIC_LIBRARIES += box2d_static  
  19. LOCAL_WHOLE_STATIC_LIBRARIES += chipmunk_static  
  20. LOCAL_WHOLE_STATIC_LIBRARIES += cocos_extension_static  
  21. #8.BUILD_SHARED_LIBRARY:指向編譯指令碼,根據所有的在 LOCAL_XXX 變數把列出的原始碼檔案編譯成一個共享庫。  
  22. include $(BUILD_SHARED_LIBRARY)  
  23. #9.將一個新的路徑加入NDK_MODULE_PATH變數。  
  24. $(call import-add-path,$(LOCAL_PATH)/platform/third_party/android/prebuilt)  
  25. #10.在Android.mk中引用模組  
  26. $(call import-module,CocosDenshion/android)  
  27. $(call import-module,extensions)  
  28. $(call import-module,external/Box2D)  
  29. $(call import-module,external/chipmunk)  

以上程式碼筆者已經進行了具體的解釋,每一行程式碼代表的作用可以從中得到。更多具體的語法,請讀者參考ndk提供的文件。

/Test/jni/Application.mk

  1. #1.指定application裡要連結的標準c++庫  
  2. APP_STL := gnustl_static  
  3. #2.編譯選項  
  4. APP_CPPFLAGS := -frtti -DCC_ENABLE_CHIPMUNK_INTEGRATION=1 -DCOCOS2D_DEBUG=1