2016-03-02 46 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結構。