一切从我开始编译项目到Android平台开始说起。
从网上各处得到的关于官方NDK的资料,都是说它不支持很多C++特性,不支持wchar_t,不可用到极点。于是各处推荐的都是crystax的改版NDK。
于是哥就信了,就冲着他的APP_USE_CPP0X:=true,毕竟大部分逻辑代码都用了至少是auto这样的C++0X的FEATURE,而且某部分代码更是用了wchar_t,wstring。下载了crystax的NDK R7 5 BETA3
然后,从这里开始,就一路坎坷了。
最开始,遇到了一个奇怪的问题,cocos2dx什么资源都get不到filedata。好吧,我看代码,它是用unzip从apk包里读资源文件的,然后一路跟进去,原来是unzOpen出错了,错误是EMFILE。好吧,我各种尝试,最后没办法,用了API LEVEL 9的AssetManager来解决这个问题。
接下来,正当一切进展顺利,项目在手机上都正常进入开始界面的时候,悲催的事情又一次发生了,socket返回-1,得到的错误号仍旧是EMFILE。这是哪来的喂,我一个文件描述符都没创建过。折腾了一阵,在cocos2dx的论坛里,一个老外发了他的问题,unzOpen出错,EMFILE。这是何其相似的问题!进去一看,这老兄也用的crystax的NDK。
我眼前一亮,怎么都是这个版本的NDK。会不会?果然,我用官方的NDK R8C和CRYSTAX的NDK R7各编译了一次,然后真机调试,NDK R7编译的果断弹错了,而官方NDK编译的纹丝不动。
这可怎么是好,没有了crystax的NDK,我怎么编译那些代码。然后我仔细查了下官方NDK的资料。原来从R8开始,就已经支持了WSTRING,而且R8还是GCC 4.4 和 GCC 4.6 双工具链,支持CPP0X也非常简单,-std=c++11就可以了。
既然当初选择crystax的NDK的理由都不再是理由了,那果断换回官方的R8吧。希望后面不会再有什么问题。