解决cocos2d-js集成到ios原生应用中退出游戏,再加载游戏时会奔溃的问题

最近在整cocos2d-js集成到ios原生应用的时候,遇到一个问题。在原生应用中加载cocos2d-js制作的游戏,然后点击ios的某个原生按钮想要退出游戏,调用了cocos2d::Director::getInstance()->end();这样调用的话退出倒是退出了,不过再次加载游戏的时候,就会奔溃了,奔溃在了 evaluatedOK = JS_ExecuteScript(cx, global, script, &rval);这行,绞尽乳汁也没想到什么为嘛会这样,尝试着在调用cocos2d::Director::getInstance()->end();的时候加了这两句

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=e&#a

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值