Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android从不同线程调用ndk函数_Android_Multithreading_Android Ndk_Andengine - Fatal编程技术网

Android从不同线程调用ndk函数

Android从不同线程调用ndk函数,android,multithreading,android-ndk,andengine,Android,Multithreading,Android Ndk,Andengine,今天我经历了一些奇怪的现象 我的应用程序有一个ndk函数,其中一个函数startStopRecording()启动和停止视频录制(使用FFMPEG) 当我从常规的Android用户界面按钮或Android菜单选项调用此函数时,该函数运行良好(在过去3个月内) 但是,当我从附加到glSurfaceView(使用AndEngine创建)的精灵调用此函数时,应用程序冻结(gl surface冻结,但从菜单选项可以正常运行,并且可以在glsurface冻结时录制),没有错误,或者是致命的错误,我无法复制

今天我经历了一些奇怪的现象

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

当我从常规的Android用户界面按钮或Android菜单选项调用此函数时,该函数运行良好(在过去3个月内)

但是,当我从附加到glSurfaceView(使用AndEngine创建)的精灵调用此函数时,应用程序冻结(gl surface冻结,但从菜单选项可以正常运行,并且可以在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 surface的所有按钮(我的应用程序中的高级动画GUI必须使用它)

有人知道我遗漏了什么吗?可能是线程冲突问题?
我试图添加计时器来检查函数是否一次只调用一次,但它仍然会使应用程序崩溃。

如何调试它

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

编辑2:

Alex cohn comment解决了问题。在UI线程上运行它是足够安全的,并且可以按预期工作。

除了致命错误以外的错误消息?我编辑了我的问题。只是简单的问题。但是,当我调用此函数时,很难调试:\n从发布的一小段代码中不太清楚,50%的时间出现了什么问题。事实上,很多事情都会出错,我并不打算尝试理解所有复杂的代码。但是想到的简单解决方案是,为什么不在UI线程上调用
startStopRecording()
?如果您有权访问活动,请调用活动<代码>(新的Runnable(){public void run(){startStopRecording();}})这实际上就是我所做的,并打算发布为已解决。因为你在我之前,所以你的答案是正确的。我将编辑为已解决。这是有意义的,因为Android小部件(适用于我)在UI线程上运行。希望我是对的。很多次!