解决cocos2d-js集成到ios原生应用中退出游戏,再加载游戏时会奔溃的问题
2017-03-13 18:03
1186 查看
最近在整cocos2d-js集成到ios原生应用的时候,遇到一个问题。在原生应用中加载cocos2d-js制作的游戏,然后点击ios的某个原生按钮想要退出游戏,调用了cocos2d::Director::getInstance()->end();这样调用的话退出倒是退出了,不过再次加载游戏的时候,就会奔溃了,奔溃在了 evaluatedOK = JS_ExecuteScript(cx, global, script, &rval);这行,绞尽乳汁也没想到什么为嘛会这样,尝试着在调用cocos2d::Director::getInstance()->end();的时候加了这两句
这样再次加载的时候倒是不会奔溃了,不过会报一个no filename的问题,此路不通。
最后看到了一篇博客,用了如下方案,竟然可行。
1、目录frameworks/cocos2d-x/cocos/platform/CCApplicationProtocol.h 下添加clearSc函数。
2、在AppDelegate.h里添加clearSc函数。
并在AppDelegate.cpp里添加实现
3、在 frameworks/cocos2d-x/cocos/scripting/js-bindings/manual/ScriptingCore.h 添加初始化判定。
并在frameworks/cocos2d-x/cocos/scripting/js-bindings/manual/ScriptingCore.cpp 作一些小修改
在createGlobalContext添加代码
在frameworks/cocos2d-x/cocos/base/CCDirector.cpp 里修改mainloop方法
然后再重新编译,就ok了,关于如何将cocos2d-js整到原生ios中,参见上一篇文章。
参考文章:http://blog.csdn.net/mu_cjgm/article/details/52372089
http://www.cocoachina.com/bbs/read.php?tid=1713866&page=ea
ScriptingCore::getInstance()->cleanAllScript(); ScriptingCore::getInstance()->reset();
这样再次加载的时候倒是不会奔溃了,不过会报一个no filename的问题,此路不通。
最后看到了一篇博客,用了如下方案,竟然可行。
1、目录frameworks/cocos2d-x/cocos/platform/CCApplicationProtocol.h 下添加clearSc函数。
virtual void clearSc() = 0;
2、在AppDelegate.h里添加clearSc函数。
virtual void clearSc();
并在AppDelegate.cpp里添加实现
void AppDelegate::clearSc(){ ScriptingCore::getInstance()->cleanup(); }
3、在 frameworks/cocos2d-x/cocos/scripting/js-bindings/manual/ScriptingCore.h 添加初始化判定。
bool ifFirst = true;
并在frameworks/cocos2d-x/cocos/scripting/js-bindings/manual/ScriptingCore.cpp 作一些小修改
void ScriptingCore::start() { // for now just this createGlobalContext(); ifFirst = false; }
在createGlobalContext添加代码
void ScriptingCore::createGlobalContext() { if (_cx && _rt) { ScriptingCore::removeAllRoots(_cx); JS_DestroyContext(_cx); JS_DestroyRuntime(_rt); _cx = NULL; _rt = NULL; } // Start the engine. Added in SpiderMonkey v25 if (!JS_Init()){ return; } if(!ifFirst){//!!!!!!!ADD THIS 添加这个初始化 initRegister(); } //............... }
在frameworks/cocos2d-x/cocos/base/CCDirector.cpp 里修改mainloop方法
void DisplayLinkDirector::mainLoop() { if (_purgeDirectorInNextLoop) { _purgeDirectorInNextLoop = false; purgeDirector(); Application::getInstance()->clearSc(); } else if (_restartDirectorInNextLoop) { _restartDirectorInNextLoop = false; restartDirector(); } else if (! _invalid) { drawScene(); // release the objects PoolManager::getInstance()->getCurrentPool()->clear(); } }
然后再重新编译,就ok了,关于如何将cocos2d-js整到原生ios中,参见上一篇文章。
参考文章:http://blog.csdn.net/mu_cjgm/article/details/52372089
http://www.cocoachina.com/bbs/read.php?tid=1713866&page=ea
相关文章推荐
- 【iOS-Cocos2d游戏开发之十】添加粒子系统特效并解决粒子特效与Layer之间的坐标问题;
- cocos2d或者iOS制作视频+虚列动画做游戏时候,视频播放和结束时顿闪问题解决方案
- cocos2d-lua整合到ios工程,即在ios原生应用中可以直接玩cocoslua开发的游戏
- 【iOS-Cocos2d游戏开发之十八】解决滚屏背景/拼接地图有黑边(缝隙)以及禁止游戏中自动锁屏问题
- IOS开发(7)WKWebView加载本地HTML、CSS、JS文件JS(解决html内访问其他资源路径问题)
- 【iOS-Cocos2d游戏开发之十】添加粒子系统特效并解决粒子特效与Layer之间的坐标问题;
- 【Cocos2d-x】问题解决记录--游戏中加载UI (CocoStudio)的配置
- 移植cocos2d-x 游戏从Android平台到IOS平台分辨率问题及解决办法
- 原生js解决微信在iOS上无法修改title的问题
- 【iOS-Cocos2d游戏开发之十八】解决滚屏背景/拼接地图有黑边(缝隙)以及禁止游戏中自动锁屏问题!
- 【iOS-Cocos2d游戏开发之十八】解决滚屏背景/拼接地图有黑边(缝隙)及禁止自动锁屏问题!
- 【iOS-Cocos2d游戏开发之七】在cocos2d中添加/删除系统组件,并解决View设置透明会影响View中的其他组件的问题!更新解决添加组件Cocos2d动画停止播放的BUG】
- 解决 cocosjs与安卓原生集成 崩溃问题
- 【iOS-Cocos2d游戏开发之十】添加粒子系统特效并解决粒子特效与Layer之间的坐标问题;
- 【iOS-Cocos2d游戏开发之十】添加粒子特效并解决粒子系统特效与Layer之间的坐标问题;
- 【iOS-Cocos2d游戏开发之七】在cocos2d中添加/删除系统组件,并解决View设置透明会影响View中的其他组件的问题!【11月28日更新解决添加组件Cocos2d动画停止播放的BUG】
- 【iOS-Cocos2d游戏开发之十八】解决滚屏背景/拼接地图有黑边(缝隙)/动画播放出现毛边以及禁止游戏中自动锁屏问题!【2011年12月18日补充】
- 【iOS-Cocos2d游戏开发之十八】解决滚屏背景/拼接地图有黑边(缝隙)及禁止自动锁屏问题! 推荐
- 原生js解决微信在iOS上无法修改title的问题
- 【iOS-Cocos2d游戏开发之十】添加粒子特效并解决粒子系统特效与Layer之间的坐标问题;