我有这个应用程序(只有一个活动),它使用一些Android UI和一些原生C ++ lib来进行OpenGl绘图和计算。
似乎活动自己创建了一些“活页夹线程”,我很确定它会导致我的本机调用之间出现一些损坏。
什么是活页夹线程? 它们可以被删除或合并成一个吗?
答案 0 :(得分:4)
最后在这个主题上找到了一些很好的信息。
无法删除或合并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.
}
});
但是,您不能在Native代码中使用它。因此,某些本机代码可能会产生意外故障。为此,您可以在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
将同样生成自己的渲染线程,因此与本机代码的相同类型的交互是要避免的。但是,通过这些提示,您应该能够同步这些线程并使其完美地工作;)