开始使用eclipse编译启动app,在logcat窗口看代码,但eclipse很迟钝,点击运行有不知道啥时候装完,
而且还能连续点击运行,我有点忍不了,既然不需要编辑,用命令行就行了,四个命令就搞定,而且运行
速度比eclipse快。
sh build_native.sh,负责编译so文件
ant debug,负责编译打包app
adb install bin/***.apk,负责将app安装到机器上,block模式,等待安装结束,多好,清晰。
看日志命令行模式更擅长
adb logcat,查看所有日志
adb logcat | grep cocos2d-x,专门看CCLog打印的日志
有了grep,想查啥都容易,比eclipse的fliter灵活。
调试环境配置好后终于找到crash原因。
1. 对齐问题
程序加载二进制文件,进行指针操作后将一个地址赋值给struct指针和float指针,当对指针进行*操作时,crash,因为该地址不符合系统的对齐要求,没办法,各系统要求不懂,只能用memcpy中转一下了。
问题虽然解决,但我还是不满意,程序从文件中读出一个大buffer后,向作为参数传递给其调用的方法,该方法继续在调用栈上传递该buffer。这样做很危险,这类对齐问题很快就扩散到整个程序中,只能跑所有路径,crash一次查一次。
按理说,应该采用scott说的那个方案,用类管理资源,每个文件对应一个类,解析buffer的代码封装进去,提供访问数据的接口就ok了,一旦出现对齐这类问题,只需要改这几个类就醒了。
补充一点:后来升级xcode5后,也碰到这个问题,头疼死了,都是优化惹的祸。有两种方式可以彻底解决这个问题。
(1),关闭加载二进制文件代码的优化,xcode可以单独设置,ndk我还没研究过
(2),修改工具,强制四位对齐,不要bool型,字符串也取4倍的定长值。
2. fopen问题
第二个问题查了半天,很诡异,不敢相信自己的眼睛,android居然不支持fopen这个标准函数,我还一直以为我的文件路径搞错了呢。不支持就不支持吧,用cocos2d-x自带的方法
std::string pathKey = path;
CCFileUtils::ccRemoveHDSuffixFromFile (pathKey);
pathKey = CCFileUtils::fullPathFromRelativePath (pathKey.c_str());
std::fullpath = pathKey;
这比fopen要简单多了。
后来,才知道,其实fopen是可以用的,之所以出问题,是因为我拿fopen直接读apk包中的文件了,因为是压缩包,不解包怎么能用呢?
这个项目的工程师好几个是应届生,没太多经验,愿意用很底层的方式写代码,这是成长付出的代价。
3. 音效问题
必须说cocos2dx的音效不怎样,连续频繁播放音效会出问题,我已经汇总成单独一篇博客了。http://blog.sina.com.cn/s/blog_4d7d5ba50101c5pf.html
4.开发环境
cocos2d的人建议我们主要使用vs开发和调试,但这未必适合所有团队。我在mac上使用emacs,装cscope,auto-compiete插件,使用compile编译,效率还凑合。唯一遗憾是没搞明白gdb,而且eclipse调试native太慢了点,看来还有很多要学的敌方。