如何在cocos2dx

时间:2016-03-02 16:50:55

标签: java-native-interface interrupt-handling cocos2d-x-3.x

尝试addChild,removeChild在硬件中断或JAVA回调中时,我遇到了很多崩溃。

我的游戏有一个软按钮来调用java,以便使用语音识别。

背景信息:

C++: btnRecord pressed -> JAVA: startVoiceRecognition -> C++: return;
JAVA: hasResult -> C++: resultHandler -> C++: addchild, removechild, etc.-> crashed randomly.

我发现它崩溃是因为当cocos在同一区域做同样的事情时我试图改变游戏数据。

Ex:当cocos渲染layerA时,JAVA也尝试删除layerA - >坠毁。

cocos是否有针对此背景的任何解决方案?

可能是一个回调队列,将在下一个游戏循环中处理?

我认为当您按下某个硬按钮时需要更改绘图场景:后退键,音量键或任何硬件中断事件是非常必要的。

1 个答案:

答案 0 :(得分:0)

是的,最后我已经解决了这个问题。

JNI回调在单独的线程中运行。这意味着当JNI发生回调时,它无法阻止cocos主线程。

我担心JNI回调会阻止cocos主线程。我应该先检查一下:(

确定!要解决此问题,请使用std::mutexscheduleOnce

像这样:

void MyGame::update(float dt)
{
    jniMutex.unlock();
    // do something
    jniMutex.lock();
}

JNI callback()
{
    jniMutex.lock();
    // scheduleOnce something
    jniMutex.unlock();
}

我想确保JNI回调在MyGame::update(float)内运行,因此我从开头就致电unlock(),并在结束时致电lock()

除此之外,我们应该使用scheduleOnce而不是尝试直接在更新函数中修改Node结构。

相关问题