您的位置:首页 > 移动开发 > Cocos引擎

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

2014-02-26 20:29 731 查看
20140617 最新的2.2.3版本,请看这里 /article/10786607.html

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

现在使用的版本是2.2 ,网上找了个参考贴 : /article/11197603.html

但是这个帖子里面用的版本是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.感谢参考贴/article/11197603.html和参考贴的参考贴/article/4571621.html的作者们!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: