原本只是想记录一些常用的使用技巧,但是越写越得意(>_<),忍不住想要做出一份相对完善的说明文档,以供大家研究探讨。
写这篇文章的起因当然是实际工程需要,在搭建一个网游的android客户端时遇到种种恶心的问题,比如文件过多导致"Argument list too long"的错误,又比如增加和删除文件时都需要维护好Android.mk配置,虽然可以通过写个脚本自动生成android.mk,但是终归不是很漂亮的解决方案。通过本文所提到的几个方法,可以使Android.mk变得十分简洁,减少增加和删减工程文件时对Android.mk的修改,工程文件数目较多时会非常实用。
我先附上修改后的cocos2d-x工程配置(在本文的最后,我还会附上原始的配置,有兴趣的同学可以对比下看看),然后在此基础上逐一说明:
- LOCAL_PATH := $(call my-dir)
- include $(CLEAR_VARS)
- LOCAL_MODULE := cocos2dx_static
- LOCAL_MODULE_FILENAME := libcocos2d
- #1 定义查找所有cpp文件的宏
- define all-cpp-files-under
- $(patsubst ./%,%, $(shell find $(LOCAL_PATH) -name "platform" -prune -o -name "*.cpp" -and -not -name ".*"))
- endef
- define all-subdir-cpp-files
- $(call all-cpp-files-under,.)
- endef
- #2 定义查找所有c文件的宏,android有默认定义,此处可酌情省略
- define all-c-files-under
- $(patsubst ./%,%, $(shell find $(LOCAL_PATH) -name "platform" -prune -o -name "*.c" -and -not -name ".*"))
- endef
- define all-subdir-c-files
- $(call all-c-files-under,.)
- endef
- #3 通过查找获取所有工程文件列表
- CPP_FILE_LIST := $(call all-subdir-cpp-files) \
- $(wildcard $(LOCAL_PATH)/platform/*.cpp) \
- $(wildcard $(LOCAL_PATH)/platform/android/*.cpp) \
- $(wildcard $(LOCAL_PATH)/platform/android/jni/*.cpp)
- C_FILE_LIST := $(call all-subdir-c-files)
- #4 加入工程文件,之所以不直接加是需要进行一个LOCAL_PATH的替换
- LOCAL_SRC_FILES := $(CPP_FILE_LIST:$(LOCAL_PATH)/%=%)
- LOCAL_SRC_FILES += $(C_FILE_LIST:$(LOCAL_PATH)/%=%)
- LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH) \
- $(LOCAL_PATH)/include \
- $(LOCAL_PATH)/kazmath/include \
- $(LOCAL_PATH)/platform/android
- LOCAL_EXPORT_LDLIBS := -llog\
- -lz \
- -lGLESv2
- #5 加入头文件
- LOCAL_C_INCLUDES := $(LOCAL_PATH) \
- $(LOCAL_PATH)/include \
- $(LOCAL_PATH)/kazmath/include \
- $(LOCAL_PATH)/platform/android
- #6 需要链接的系统默认库
- LOCAL_LDLIBS := -lGLESv2 \
- -lEGL \
- -llog \
- -lz
- #7 加入静态库,加了LOCAL_WHOLE_STATIC_LIBRARIES代表编译器会将静态库完整链接而不会进行删减优化
- LOCAL_WHOLE_STATIC_LIBRARIES := cocos_libpng_static
- LOCAL_WHOLE_STATIC_LIBRARIES += cocos_jpeg_static