一、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文件