2016-03-02 41 views
0

我在尝试addChild,removeChild内部硬件中断或JAVA回调时遇到了很多崩溃。如何处理JNI,硬件中断在cocos2dx中

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

上下文:

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

我想通了,这是因为坠毁我试图改变游戏数据时茯苓是做samething,在同一地区。

例如:当cocos渲染layerA时,JAVA也尝试去掉layerA - >崩溃。

对于这种情况,科科斯是否有任何解决方案?

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

我觉得当你按下一些硬按钮时需要改变绘图场景:回退键,音量键或任何硬件中断事件是非常必要的。

回答

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结构。