【问题标题】:how to handle JNI, hardware interrupt in cocos2dxcocos2dx中如何处理JNI、硬件中断
【发布时间】:2016-03-02 16:50:54
【问题描述】:

在尝试在硬件中断或 JAVA 回调中添加、删除Child 时,我遇到了很多崩溃。

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

上下文:

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

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

例如:当 cocos 渲染 layerA 时,JAVA 也试图移除 layerA -> crashed.

cocos 有针对这种情况的解决方案吗?

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

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

【问题讨论】:

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


    【解决方案1】:

    是的,我终于解决了这个问题。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-22
      • 1970-01-01
      • 1970-01-01
      • 2011-06-22
      相关资源
      最近更新 更多