拇指接龙游戏从WIN32向Android移植过程问题记录(1)

  1. 云栖社区>
  2. 博客>
  3. 正文

拇指接龙游戏从WIN32向Android移植过程问题记录(1)

技术小甜 2017-11-16 15:29:00 浏览844
展开阅读全文

本文将较细致地记录下最近开发课程中的示例游戏-拇指接龙游戏在从WIN32向Android移植过程中遇到的若干问题及相应解决办法。


  目前极不完整,待进一步整理。


问题2


连接真机测试运行时,在SplashScreen运行时便出现如下错误提示(log.txt):

09-16 13:28:16.525: I/GLThread(25784): sending render notification tid=10
09-16 13:28:18.530: D/cocos2d-x debug info(25784): cocos2d: removeAction: Target not found
09-16 13:28:18.530: D/cocos2d-x debug info(25784): cocos2d: removeAction: Target not found
09-16 13:28:19.520: D/cocos2d-x debug info(25784): Get data from file(armature/ButterflyArmature_01.ExportJson) failed!
09-16 13:28:19.520: D/cocos2d-x debug info(25784): GetParseError Text only contains white space(s)
09-16 13:28:19.520: D/cocos2d-x debug info(25784): Assert failed: CCAnimationData not exist! 

09-16 13:28:19.520: E/cocos2d-x assert(25784): F:/Games2014/ThumbelinaCell/projects/ThumbelinaCell/proj.android/../../../extensions/CocoStudio/Armature/CCArmature.cpp function:init line:151
09-16 13:28:19.520: E/cocos2d-x assert(25784): F:/Games2014/ThumbelinaCell/projects/ThumbelinaCell/proj.android/../../../extensions/CocoStudio/Armature/CCArmature.cpp function:init line:157


date: 2014-9-19  为了忘却的纪念

=================

  上面加这两天同时进行WIN32向ANDROID与IOS的移植,感觉问题真不少!其一,微软的C++编译器与苹果的G++严谨程度很不一样:当然是前者松,而后者紧。

其二,CocoStudio(或者现在的Cocos Studio)开发小组这一块(我估计)问题也不少。我估计,无论直接安装CocoStudio还是下载较新一些的Cocos2d-x,其中Extension那一块很可能都是CocoStudio开发小组提供的。


  就拿上面的问题来说,文件名与文件路径大小写问题!我分析了部分Extension代码,发现不少地方比较字符串时区分大小写。他们编码中直接使用这样的语句:

   if(str.compare("json")==0 || str.compare("ExportJson")==0){......}


  刚才关闭了VS,也懒得打开了,反正就是类似于上面方式!可怕吧!!!!!!!!!!!!!


  因为现在还没有彻底通过,所以还不能够全面总结教训。一句话:无论是ANDROID,还是IOS,很可能你前期都是在WIN32下编码与调试;那么,在涉及到资源文件命名时最好全面使用小写(虽然使用firstFunc不安全而使用firstfunc又容易写错,那么干脆使用first_func吧),当然也包括在创建CocoStudio相关的各种资源文件命名时;否则,你会浪费大量时间在这些东西上!


    进一步补充(2014-9-21):因为Android与iOS本质上就是Unix,所以其路径名与文件名均区别大小写--从而也理解上面直接使用compare进行区分大小写的比较。因此,只要你有绝对把握控制完全的大小写一致,即在各种(设计时与编译时)情况下都一致,那么你可以尽情地命名文件与路径。切记!切记!

  上面错误的原因,就是因为上述类似操作导致的。


问题1


    先上错误图,如下:

wKiom1QbyBzD-QTEAAMjJRrNQCI822.jpg



  问题1与问题2顺序并没有颠倒!前面问题1记录的是在cygwin下使用如下命令后,再转移到ANDROID下编译运行时出现的错误。

1
2
cd /cygdrive/f/Games2014/ThumbelinaCell/projects/ThumbelinaCell/proj.android
./build_native.sh

  其作用是调用NDK编译生成.o库文件(最关键部分,把C/C++代码编译链接生成为JAVA所调用的库文件);此库文件再为JAVA代码所调用。


  其实,在高版本的NDK下(我使用的是NDK R8E),已经不再需要cygwin这个类linux控制台环境(安装这个cygwin太浪费时间了,记得十多年前安装过一次,主要是为学习gcc,那时倒轻松;可以与当时国外网站访问方便有重大关系吧)。也就是说,只要安装好ADT,并配置好NDK编译路径,直接在Eclipse环境下编译链接便OK了。

  

   之所以列出这里的“问题1”截图,正是为了说明这一点。即以后,我们不再留恋cygwin这个老朋友了(还真有点舍他不得......)。



   而且,上面是第一次在Eclipse下使用NDKR8E编译拇指接龙对应的Android工程得到的错误提示。注意:我使用的是CocoStudio 1.4.0.1(其内集成了cocos2d-x 2.2.3)。


   解决上述截图错误的办法如下:


      根据上述错误提示,我打开文件MainScene.h,发现了如下(我自己都有些惊奇了!--这是我不小心使用VS提供的自动化生成方法功能导致的)

1
2
3
4
5
    //menu callback
    void MainScene::onToolbarHandler(CCObject *pSender, TouchEventType type);
    void MainScene::onPauseHandler(CCObject *pSender, TouchEventType type);
    void MainScene::onGUI2Handler(CCObject *pSender, TouchEventType type);
    void MainScene::onBonusContinueHandler(CCObject *pSender, TouchEventType type);

  抓紧修改,把那些MainScene::全都去掉。借问一句:使用什么软件打开这个.h文件最好呢?使用VS?太慢了?使用EditPlus?凑合吧!但是,根据我最近修改经验,使用EditPlus修改居然不成功(此前我还比较迷信这个工具),只好使用VS。但是,比EditPlus更好用的要当NotePad++(在家中刚刚下载了最新的6.6.9,好用!)当然,批量把.cpp/.h文件修改为UTF-8等功能,此前我还都借助于EditPlus。


  修改后,继续运行“Project-Build Project”命令。


问题3

  

  继续干活,继续出错!不好,又出现下面一句:


jni/../../Classes/MainScene/MainScene.cpp:7:17: fatal error: vld.h: No such file or directory
compilation terminated.


  不好,vld.h文件怎么能够打包呢!赶快使用NotePad++注释掉!可能还有很多vld.h引用没有注释掉吧,还是使用VS一下全部找出来处理算了!



问题4


jni/../../Classes/TutorialUI/TutorialScene.cpp:668:41: error: request for member 'c_str' in '"Continue"', which is of non-class type 'char const [9]'
jni/../../Classes/TutorialUI/TutorialScene.cpp:722:41: error: request for member 'c_str' in '"Continue"', which is of non-class type 'char const [9]'


错误代码如下:

1
guidLabelText->setText("Continue".c_str());

修改为:

1
guidLabelText->setText("Continue");

看起来,VC++就是不太严谨!!!


问题5


过一会儿,又出现如下错误:

ake: *** [obj/local/armeabi/objs/cocos_extension_static/GUI/CCControlExtension/CCControlSaturationBrightnessPicker.o] Error 126
make: Leaving directory `/cygdrive/f/Games2014/ThumbelinaCell/projects/ThumbelinaCell/proj.android'
make: *** Deleting file `obj/local/armeabi/objs/cocos_extension_static/GUI/CCControlExtension/CCControlSaturationBrightnessPicker.o'

**** Build Finished ****


从字面上来看,是CCControlSaturationBrightnessPicker.cpp文件中出现了错误。还好,我没有使用这些功能!接下来看,它自动删除了。但是,直接退出,不再干活了!

  没有办法,我再次编译吧。又开始干活了...


问题6


过一会儿,又出现如下错误:

wKiom1Qb3mbhZAyUAAGDVLK09mc122.jpg


出现上述“undefined reference to...”错误的原因比较复杂,其实最常见的是没有提供函数实现体(或者按默认编译顺序找不到)。在我的情况下,家中的版本老些了(现在编译的是办公些新添加了商店模块后的版本),所以修改一下android.mk,把上述缺乏的文件添加进行即可。


问题7


接下来,要等待30分钟左右。总体感觉,在cygwin下与在Eclipse下操作速度相关不大,约需要近50分钟。在办公室配置的i3, 4核,4G内存台式机上估计至多20分钟即可完成。

目前没有问题了---初始成功生成库文件libThumbelinaShared.so!


接下来,要进行到艰难的UI运行级调试了。当然,也是在Eclipse下运行程序,然后逐渐调试......















本文转自朱先忠老师51CTO博客,原文链接: http://blog.51cto.com/zhuxianzhong/1553218,如需转载请自行联系原作者



网友评论

登录后评论
0/500
评论