cocos2d-x 编译 Anroid版本遇到的问题以及解决办法
来源:互联网 发布:巨人网络策划笔试题 编辑:程序博客网 时间:2024/04/30 15:58
这几天都在苦逼的编译程序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, 哎,先将就着用吧。
- cocos2d-x 编译 Anroid版本遇到的问题以及解决办法
- cocos2d-x 编译 Anroid版本遇到的问题以及解决办法
- cocos2d-x 编译 Anroid版本遇到的问题以及解决办法
- 命令行编译cocos2d-x遇到的问题。
- COCOS2D-X在给弹出框加入弹出效果过程中遇到的问题以及解决办法
- quick-cocos2d-x Qt版本在windows上遇到的编译问题 LNK2001 !
- cocos2d-2.x创建项目以及编译SO遇到的问题
- 编译cocos2d-x for android 项目遇到的问题
- 初试cocos2d-x,编译运行cocos2d-x范例的过程和遇到的问题。
- 编译tiny6410 wince6.0 BSP遇到的问题以及解决办法
- 在编译Android 工程时常遇到的问题,以及解决办法。
- CCS编译中常常遇到的问题以及解决办法
- OBS编译遇到了问题以及解决办法
- Cocos2d-x/Cocos2d-js编译64位so库中遇到的问题
- 用NDK r9版本编译cocos2d x 2.0.4遇到的各个坑
- Android-cocos2d-x配置遇到的问题
- cocos2d-x学习遇到的问题
- cocos2d-x android HelloCpp 遇到的问题。
- 形参、普通(非静态)局部变量和静态局部变量差别---求取指定整数间阶乘
- C语言分解质因数
- JS 在标签中使用this 需注意事项
- 各种音频编码方式详解
- javascript setTimeout方法的使用
- cocos2d-x 编译 Anroid版本遇到的问题以及解决办法
- 固体模拟简介(Introduction to solid)
- shell的一些问题
- 数据库日志减肥。自己试过可以
- Sed 的使用方法
- ORA-12519引出的问题
- Windows Server 2008 R2 下配置证书服务器和HTTPS方式访问网站
- Keepalived安装
- ssh 登录基本原理和验证过程