Android ndk binder线程导致应用程序出现问题
Posted
技术标签:
【中文标题】Android ndk binder线程导致应用程序出现问题【英文标题】:Android ndk binder thread causing problems in app 【发布时间】:2011-09-07 09:11:23 【问题描述】:我有这个应用程序(只有一个活动),它使用一些 android UI 和一些本机 C++ 库来进行 OpenGL 绘图和计算。
似乎该活动自己创建了一些“绑定线程”,我很确定它会在我的本机调用中造成一些损坏。
什么是活页夹线程? 它们可以被删除或合并为一个吗?
【问题讨论】:
【参考方案1】:终于找到了一些关于这个主题的好信息。
Binder 线程无法删除或合并,但您可以使用 Handler
和 Runnable
对象轻松地将函数调用重定向到主线程。
Handler handle = new Handler(); //Will be associated with current thread
handle.post(new Runnable ()
@Override public void run()
// Your code to be executed in this thread
// you can call native code here to make sure they run under this thread.
);
但是,您不能在本机代码中使用它。因此,您的某些本机代码可能会产生意外错误。为此,您可以在 JNI 中同步您的代码,以尽量减少奇怪的行为。 (details)
env->MonitorEnter(obj);
// Your code
env->MonitorExit(obj);
您还可以重定向代码的某些部分以在 UI 线程内执行(如果您希望在 UI 上获得性能,我不建议这样做)
myActivity.runOnUiThread(new Runnable ()
@Override public void run()
// Your code
);
如果你像我一样使用GLSurfaceView
,你也可以将代码重定向到GL线程中
myGLSurfaceView.queueEvent(new Runnable()
@Override public void run()
/* do something on the GLSurfaceView thread */
);
请务必注意,android 将始终为 UI 创建一个单独的线程,因此从您的 UI 代码和其他地方调用本机代码显然会导致意外行为。
此外,使用GLSurfaceView
将同样生成自己的渲染线程,因此要避免与本机代码发生相同类型的交互。但是,有了这些提示,您应该能够同步这些线程并使其完美运行;)
【讨论】:
这也有一些有用的建议:blogs.arm.com/software-enablement/238-10-android-ndk-tips 当然还有:developer.android.com/guide/topics/fundamentals/… 请注意,Handler 不限于 UI 线程。您可以随时创建新的 HandlerThread,并在该线程上执行 post() 可运行对象。以上是关于Android ndk binder线程导致应用程序出现问题的主要内容,如果未能解决你的问题,请参考以下文章
千里马android framework实战开发-binder驱动之oneway导致的transaction failed
千里马android framework实战开发-binder驱动之oneway导致的transaction failed
千里马android framework实战开发-binder驱动之oneway导致的transaction failed