cocos2d-x 编译 Anroid版本遇到的问题以及解决办法

这几天都在苦逼的编译程序Android版本,到昨天晚上终于能编译通过且正常运行,现在把这几天遇到的问题和大家分享一下:

一 无法替换cocos2d-x本身自带的libxml2

    为什么需要自己编译libxml2:

    由于我以前解析xml使用的是Tree的方式,在Win32以及GMO上能够正常运行,但是在ndk下编译的时候遇到问题了,原来cocos2d-x使用的libxml2把Tree的解析方式关闭了。于是乎摆在我面前的是两条路,第一条是重新编译一版libxml2,打开Tree的解析方式;第二条是修改以前的代码,采用SAX的解析方式。由于修改代码的工作量比较大,所以决定先采用第一个方案。(PS:推荐大家在以后的程序中解析xml使用SAX的方式,省很多内存)

    编译时遇到的问题:

    先将libxml2源代码(从Android 2.2的源代码中拷贝出来的,稍作修改)拷贝到cocos2d-x根目录,然后修改yourgame/android/jni/Android.mk, 修改如下

    subdirs := $(addprefix $(LOCAL_PATH)/../../../,$(addsuffix /Android.mk, \

           libxml2 \            # this is the new add content

           cocos2dx \

           CocosDenshion/android \

))

subdirs := $(addprefix $(LOCAL_PATH)/../../../,$(addsuffix /Android.mk, \
           libxml2 \
           cocos2dx \
           CocosDenshion/android \ ))
       然后将cocos2dx\platform\third_party\android\libraries\libxml2.a删除,再修改yourgame和cocos2d-x使用的新的libxml2的头文件目录,最后编译。然后果断的悲剧了,libxml2的代码不会被编译,然后在链接cocos2d-x so的时候会提示link error (libxml2的接口找不到实现)。

    解决办法:

       修改cocos2d-x的Makefile文件,修改如下:

       LOCAL_LDLIBS := -L$(call host-path, $(LOCAL_PATH)/platform/third_party/android/libraries) \

                 -lGLESv1_CM -llog -lz \

                 -lpng \

                 -ljpeg \

#                 -lxml2  #delete the old style of link libxml2

LOCAL_STATIC_LIBRARIES := libxml2   # add to enable auto build of libxml2

     yourgame 的makefile 的修改参考cocos2d-x。 哈哈,终于能正常编译了。

二 编译命令始终是compile++ thumb 或者 compilethumb

    为什么不要使用thumb:

    thumb指令集是为了满足一些低端的设备而加上的,使用的是16位的指令集,能压缩代码密度,但是指令比普通的32位arm指令弱很多,所以建议关闭掉。

    解决办法:
    在每个Android.mk 中每个Module加上LOCAL_ARM_MODE := arm ,这样就能看到compile++ arm 和compile arm 了。

三 无法载入资源

    问题描述:

    在Android 程序编译完打包之后,安装上设备,提示"Get data from file **** failed", 但是发现文件路径是对的,只是中间有"."或者".."。

    问题产生的原因:

    在请教高人之后知道android程序中使用的资源是打包在压缩文件里面的,程序中只能通过在压缩包的全路径名去获取文件,并且不能有相对路径(如"." , "..")。而且,不能通过fopen去打开,因为文件目录根本就没有这个文件。

    解决办法:

    1. 将plist文件和png,动画配置xml和png放在相同的目录,plist和xml中包含的文件名和plist以及xml在相同的目录下。

    2. 在解析xml的时候不能使用xmlReadFile,而使用如下方式:

    const char* xmlConfFullPath = CCFileUtils::fullPathFromRelativePath(yourfilename);    

    CCFileData data(xmlConfFullPath, "rt");

    unsigned long size = data.getSize();

    char *pBuffer = (char*) data.getBuffer();

    doc = xmlReadMemory(pBuffer, size, NULL, "UTF-8", XML_PARSE_RECOVER);

    四 dynamic_cast不能使用

    问题描述:

    dynamic_cast返回NULL,但是在Win32上是能正常工作的。

    原因:

    不详,反正搞不定,试过以下各种办法,均以失败告终:

    1. 修改Application.mk,添加如下:

        APP_STL := gnustl_static

        APP_CPPFLAGS += -frtti

    2. 修改编译器,使用gcc编译C+代码,且在链接时将-lsupc+ 换成-lstdc++

    最后只能放大招:

    将dynamic_cast 改为static_cast, 哎,先将就着用吧。

没有更多推荐了,返回首页