我有这个应用程序(只有一个活动),它使用一些android UI和一些原生C++库来绘制和计算OpenGl。
这个活动似乎自己创建了一些"绑定线程",我很确定它会导致我的本地调用出现一些损坏。
装订线是什么?它们可以被删除或合并为一个吗?
终于找到了一些关于这个主题的好信息。
-
绑定线程不能被删除或合并,但通过使用
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中同步您的代码,以最大限度地减少奇怪的行为。(详细信息)
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
同样会生成自己的线程进行渲染,因此要避免与本机代码发生相同的交互。但是,有了这些提示,您应该能够同步这些线程并使其完美地工作;)