一切從我開始編譯項目到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來解決這個問題。
接下來,正當一切進展順利,項目在手機上都正常進入開始界面的時候,悲催的事情又一次發(fā)生了,socket返回-1,得到的錯誤號仍舊是EMFILE。這是哪來的喂,我一個文件描述符都沒創(chuàng)建過。折騰了一陣,在cocos2dx的論壇里,一個老外發(fā)了他的問題,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吧。希望后面不會再有什么問題。