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