android.mk文件

一、Android.mk說明:

Android.mk是Android提供的一種makefile文件。 Android.mk將是GNU Makefile的一部分,用來指定諸如編譯生成so庫名、引用的頭文件目錄、需要編譯的.c/.cpp文件和.a靜態庫文件等。

二、示例代碼

在cocos2dx中爲Android打包時,需要編寫Android.mk文件,代碼如下:


# Android.mk必須首先定義LOCAL_PATH變量,用於查找源文件。宏函數'my-dir'由編譯系統提供,
# 返回當前路徑(即包含Android.mk文件的目錄)
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

#導入庫目錄
$(call import-add-path,$(LOCAL_PATH)/../../cocos2d)
$(call import-add-path,$(LOCAL_PATH)/../../cocos2d/external)
$(call import-add-path,$(LOCAL_PATH)/../../cocos2d/cocos)
$(call import-add-path,$(LOCAL_PATH)/../../cocos2d/extensions)
$(call import-add-path,$(LOCAL_PATH)/../../cocos2d/cocos/editor-support)
$(call import-add-path,$(LOCAL_PATH)/../../cocos2d/cocos/editor-support/cocostudio)
$(call import-add-path,$(LOCAL_PATH)/../../cocos2d/cocos/editor-support/spine)
$(call import-add-path,$(LOCAL_PATH)/../../modules)

# 這個模塊的名字,它必須是唯一的,而且不能包含空格 ,由此變量名決定最終生成的目標文件名。 
LOCAL_MODULE := cocos2dcpp_shared

# 設置模塊的二進制文件的名稱,獨立於LOCAL_MODULE (在libs/armeabi下生成libMyGame.so文件),
# 即允許用戶重新定義最終生成的目標文件名。    
LOCAL_MODULE_FILENAME := libcocos2dcpp


#遍歷目錄和子目錄  
define walk  
 $(wildcard $(1)) $(foreach e, $(wildcard $(1)/*), $(call walk, $(e)))  
endef  
#遍歷路徑Classes下得目錄和子目錄文件,並存入ALLFILES變量中  
ALLFILES = $(call walk, $(LOCAL_PATH)/../../Classes)  
#從ALLFILES目錄中提取文件,並存入FILE_LIST中  
#.cc是Linux/Unix下爲C++源文件的默認擴展名,與.cpp一個意思  
#.c 因爲我要用到sqlite3.c    
FILE_LIST := hellocpp/main.cpp  
FILE_LIST += $(filter %.cpp, $(ALLFILES))  
FILE_LIST += $(filter %.c, $(ALLFILES))  
FILE_LIST += $(filter %.cc, $(ALLFILES))

#搜索Classes下的子目錄文件  
FILE_INCLUDES += $(shell find $(LOCAL_PATH)/../../Classes -type d)  
#根據搜索到的文件名 編譯資源文件  
LOCAL_SRC_FILES := $(FILE_LIST:$(LOCAL_PATH)/%=%)


# 可選變量,表示頭文件的搜索路徑
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes \
                    $(LOCAL_PATH)/../../cocos2d \
                    $(LOCAL_PATH)/../../cocos2d/cocos \
                    $(LOCAL_PATH)/../../cocos2d/cocos/audio/include \
                    $(LOCAL_PATH)/../../cocos2d/cocos/editor-support \
                    $(LOCAL_PATH)/../../cocos2d/cocos/editor-support/cocostudio \
                    $(LOCAL_PATH)/../../cocos2d/cocos/editor-support/spine \
                    $(LOCAL_PATH)/../../cocos2d/extensions \
                    $(LOCAL_PATH)/../../cocos2d/external \
                    $(LOCAL_PATH)/../../cocos2d/external/chipmunk/include/chipmunk \


# 加入靜態庫,加了LOCAL_WHOLE_STATIC_LIBRARIES代表編譯器會將靜態庫完整鏈接而不會進行刪減優化  
LOCAL_WHOLE_STATIC_LIBRARIES := cocos2dx_static

LOCAL_WHOLE_STATIC_LIBRARIES += spine_static
LOCAL_WHOLE_STATIC_LIBRARIES += cocostudio_static
LOCAL_WHOLE_STATIC_LIBRARIES += cocos_network_static
LOCAL_WHOLE_STATIC_LIBRARIES += cocos_extension_static
LOCAL_WHOLE_STATIC_LIBRARIES += cocos_ui_static
LOCAL_WHOLE_STATIC_LIBRARIES += protobuf_static

LOCAL_WHOLE_STATIC_LIBRARIES += chipmunk_static


#添加友盟庫
LOCAL_SHARED_LIBRARIES := mobclickcpp_shared

include $(BUILD_SHARED_LIBRARY)


# 在Android.mk中引用模塊 ,添加導入庫(基於import-add-path添加的導入庫目錄) 
$(call import-module,.)
$(call import-module,audio/android)

$(call import-module,extensions)
$(call import-module,editor-support/spine)
$(call import-module,editor-support/cocostudio)
$(call import-module,network)
$(call import-module,protobuf)
$(call import-module,external/chipmunk)
#導入友盟模塊
$(call import-module,libmobclickcpp)

三、補充說明

CLEAR_VARS

CLEAR_VARS由編譯系統提供(在ndk下的build/core/clear-vars.mk),它可以讓GNU MAKEFILE爲你清除許多LOCAL_XXX變量
(例如:LOCAL_MODULE 、LOCAL_SRC_FILES等 ),但是 LOCAL_PATH 除外。 因爲所有的編譯控制文件都在同一個GNU MAKE
執行環境中,即所有的變量都是全局的,所以需要清理。

BUILD_SHARED_LIBRARY

指向編譯腳本,根據所有的在 LOCAL_XXX 變量把列出的源代碼文件編譯成一個共享庫。它負責收集自從上次調用 include $(CLEAR_VARS) 後的所有LOCAL_XXX信息。並決定編譯爲什麼。編譯成靜態庫.a文件, 靜態庫不能夠加入到Project 或者APK中。

import-module

import-module用於導入外部的庫,外部模塊提供的.mk。import-module的路徑是.mk文件所在目錄。比如:
$(call import-module,extensions),則在cocos2d\extensions文件夾下有Android.mk文件

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章