Android调用来自不同线程的ndk函数

时间:2014-02-04 09:40:16

标签: android multithreading android-ndk andengine

今天我遇到了奇怪的现象

我的应用程序有一个ndk函数,其中一个startStopRecording()启动和停止视频录制(使用FFMPEG)

当我从常规Android UI按钮或Android MenuOptions调用此功能时,该功能完美运行(在过去3个月内)

但是,当我从连接到glSurfaceView(使用AndEngine创建)的精灵调用此函数时,应用程序冻结(gl表面冻结,但是从菜单选项仍然可以正常运行并且可以在glsurface冻结时进行录制),没有错误,或者我无法复制的致命错误,因为我不再得到它。但是调用的函数是一个总是有效的函数,只是从不同的地方调用。

我的代码:

Spritebutton20 = new Sprite(CAMERA_WIDTH-3*(CAMERA_WIDTH/12), 1*CAMERA_HEIGHT/12,        CAMERA_WIDTH/7, CAMERA_HEIGHT/7 ,mCloudTextureRegion, this.getVertexBufferObjectManager()){
          @Override
          public boolean onAreaTouched(final TouchEvent pSceneTouchEvent, final float     pTouchAreaLocalX, final float pTouchAreaLocalY) {
            if(pSceneTouchEvent.isActionDown()){    
                 startStopRecording();
                        }
                return true;
        }
    };

这真的很奇怪,因为同样的功能在几个月内从Android按钮和菜单中运行良好,但我将所有按钮切换为gl表面(我必须在我的应用程序中使用它来进行高级动画GUI)。

有人知道我在这里缺少什么吗?也许是线程冲突问题? 我试图添加计时器来检查该函数一次只调用一次,但它仍然使应用程序崩溃。

如何调试?

编辑:
这种情况在50%的时间内发生。这意味着它有时会起作用,有时它会冻结 从计算机科学的角度来看 - 有时会发生这种情况,有时甚至不会发生。即使在相同的应用程序运行中,也确实是50/50。

编辑2:
解决了Alex cohn comment.run它在UI线程上足够安全并按预期工作。

0 个答案:

没有答案