cocos2d-x 2.2 android 使用已有静态库(*.a),大幅减少编译时间

来源:互联网 发布:c语言求最大值 编辑:程序博客网 时间:2024/06/03 19:24

20140617 最新的2.2.3版本,请看这里 http://blog.csdn.net/wk3368/article/details/31778285

*******分割线***********************

现在使用的版本是2.2 ,网上找了个参考贴 : http://blog.csdn.net/etring/article/details/8608032

但是这个帖子里面用的版本是2.1 跟现在用的2.2有些目录结构不一样,而且跟本项目的使用环境也不一样(比如本项目里面用到了websocket)直接照搬会报错。

花了一下午研究,发现其核心就是:如果缺少xx库,就先在cocos2d-x-2.x的目录下找xx对应的文件所在的目录,然后就把该目录下的Android.mk里面的内容,挪到prebuild/Android.mk里面去(当然还得修改路径),同时把xx.a也挪到prebuild目录下.

下面整理一个本项目用到的最终cocos2d-x-2.2的完整解决方案:

1.假设{cocos2d-x-2.2}是你的根目录,{cocos2d-x-2.2}/projects/XXXCpp是你用python脚本生成的项目。

2.先在Elipse里面正常编译运行一次,{cocos2d-x-2.2}/projects/XXXCpp/proj.android/obj/local/armeabi/下面会生成若干*.a和一个.so和一个objs文件夹:


2.在{cocos2d-x-2.2}目录下,新建prebuild文件夹,拷贝{cocos2d-x-2.2}/projects/XXXCpp/proj.android/obj/local/armeabi/*.a 到这个文件夹

3.在{cocos2d-x-2.2}/prebuild下面新建一个Android.mk,内容如下:

#start############################

LOCAL_PATH := $(call my-dir)



include $(CLEAR_VARS)


LOCAL_MODULE := cocos2dx_static
LOCAL_MODULE_FILENAME := libcocos2d


LOCAL_SRC_FILES := libcocos2d.a


LOCAL_EXPORT_C_INCLUDES := \
$(LOCAL_PATH)/../cocos2dx \
$(LOCAL_PATH)/../cocos2dx/include \
$(LOCAL_PATH)/../cocos2dx/kazmath/include \
$(LOCAL_PATH)/../cocos2dx/platform/android \


LOCAL_EXPORT_LDLIBS := -llog \
                       -lz \
                       -lGLESv2


LOCAL_CFLAGS := -Wno-psabi -DUSE_FILE32API
LOCAL_EXPORT_CFLAGS := -Wno-psabi -DUSE_FILE32API


LOCAL_WHOLE_STATIC_LIBRARIES := cocos_libpng_static
LOCAL_WHOLE_STATIC_LIBRARIES += cocos_jpeg_static
#LOCAL_WHOLE_STATIC_LIBRARIES += cocos_libxml2_static
LOCAL_WHOLE_STATIC_LIBRARIES += cocos_libtiff_static
LOCAL_WHOLE_STATIC_LIBRARIES += cocos_libwebp_static


include $(PREBUILT_STATIC_LIBRARY)


include $(CLEAR_VARS)
LOCAL_MODULE := cocosdenshion_static
LOCAL_MODULE_FILENAME := libcocosdenshion
LOCAL_SRC_FILES := libcocosdenshion.a
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/../CocosDenshion/include
include $(PREBUILT_STATIC_LIBRARY)


include $(CLEAR_VARS)
LOCAL_MODULE := box2d_static
LOCAL_MODULE_FILENAME := libbox2d
LOCAL_SRC_FILES := libbox2d.a
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/../external
include $(PREBUILT_STATIC_LIBRARY)


include $(CLEAR_VARS)
LOCAL_MODULE := chipmunk_static
LOCAL_MODULE_FILENAME := libchipmunk
LOCAL_SRC_FILES := libchipmunk.a
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/../external/chipmunk/include/chipmunk
LOCAL_CFLAGS := -std=c99
include $(PREBUILT_STATIC_LIBRARY)




include $(CLEAR_VARS)
LOCAL_MODULE    := libwebsockets_static
LOCAL_MODULE_FILENAME := libwebsockets
LOCAL_SRC_FILES := libwebsockets.a
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/../external/libwebsockets/android/include
LOCAL_CPPFLAGS := -D__STDC_LIMIT_MACROS=1
LOCAL_EXPORT_CPPFLAGS := -D__STDC_LIMIT_MACROS=1
include $(PREBUILT_STATIC_LIBRARY)



include $(CLEAR_VARS)
LOCAL_MODULE := cocos_extension_static
LOCAL_MODULE_FILENAME := libextension
LOCAL_SRC_FILES := libextension.a
LOCAL_EXPORT_C_INCLUDES := \
$(LOCAL_PATH)/../extensions \
$(LOCAL_PATH)/../extensions/CCBReader \
$(LOCAL_PATH)/../extensions/GUI/CCControlExtension \
$(LOCAL_PATH)/../extensions/GUI/CCScrollView \
$(LOCAL_PATH)/../extensions/network
LOCAL_WHOLE_STATIC_LIBRARIES := cocos2dx_static
LOCAL_WHOLE_STATIC_LIBRARIES += cocos_curl_static
LOCAL_WHOLE_STATIC_LIBRARIES += box2d_static
LOCAL_WHOLE_STATIC_LIBRARIES += chipmunk_static
LOCAL_WHOLE_STATIC_LIBRARIES += libwebsockets_static
include $(PREBUILT_STATIC_LIBRARY)


$(call import-add-path,$(LOCAL_PATH)/../cocos2dx/platform/third_party/android/prebuilt)
$(call import-module,libjpeg)
$(call import-module,libpng)
#$(call import-module,libxml2)
$(call import-module,libtiff)
$(call import-module,libcurl)
$(call import-module,libwebp)

#end############################


说明:

1).红色所在行是我在原贴的基础上添加的,因为本项目用到了websocket,所以直接用原帖提供的Android.mk编译报错,先是说找不到libwebsockets.h,好不容易找到libwebsockets.h的目录在{cocos2d-x-2.2}/external/libwebsockets/,先把{cocos2d-x-2.2}/external/libwebsockets/android/lib/armeabi/libwebsockets.a拷贝到{cocos2d-x-2.2}/prebuild/下然后把里面的{cocos2d-x-2.2}/external/libwebsockets/android/include/Android.mk文件的内容挪过来,并修改了路径,再加了相关的对应行。找不到libwebsockets.h的问题解决了,但是紧接着有报错说WebPxxx没定义(具体名称忘了),继续跟Y死磕。又把libwebp的目录找到,模拟同目录的libjpeg等文件的添加方式加进来,编译终于通过了。

2).绿色的2行xml2相关的是被我在原文件的基础上注释掉了的。1是因为我们项目现在没用到xml2,2是因为现在libxml2的目录在2.2版本里面已经不在prebuilt目录下了,改到了{cocos2d-x-2.2}/cocos2dx/platform/third_party/emscripten/libxml2。等需要用到的时候再说。有朋友着急的话,可以参考前面的做法自行添加。

4.修改{cocos2d-x-2.2}/projects/XXXCpp/proj.android/jni/Android.mk,注释最后6行,再添加一行:

#$(call import-module,cocos2dx)#$(call import-module,cocos2dx/platform/third_party/android/prebuilt/libcurl)#$(call import-module,CocosDenshion/android)#$(call import-module,extensions)#$(call import-module,external/Box2D)#$(call import-module,external/chipmunk)$(call import-module,prebuild)


5.Eclipse里面编译运行,大功告成!以后每次编译运行可以节省好几分钟(不用每次都重新生成*.a)如果不clean的话,直接增量编译,只需要等十几秒就出现选择安装设备的弹窗了。nice!

6.这个prebuild/Android.mk文件是一个动态变化的文件,随着项目的进展,如果使用了新的库或者发现明明在cocos2d-x框架里面的库但是出现编译报错,那么都可能需要返回第二步,重新走一遍流程!

7.感谢参考贴http://blog.csdn.net/etring/article/details/8608032和参考贴的参考贴http://vaero.blog.51cto.com/4350852/1117957的作者们!

0 0