Android ndk binder线程导致app中出现问题

时间:2011-06-02 20:31:49

标签: android android-layout android-widget android-ndk android-manifest

我有这个应用程序(只有一个活动),它使用一些Android UI和一些原生C ++ lib来进行OpenGl绘图和计算。

似乎活动自己创建了一些“活页夹线程”,我很确定它会导致我的本机调用之间出现一些损坏。

什么是活页夹线程? 它们可以被删除或合并成一个吗?

1 个答案:

答案 0 :(得分:4)

最后在这个主题上找到了一些很好的信息。

  • 无法删除或合并Binder线程,但您可以使用HandlerRunnable对象轻松地将函数调用重定向到主线程。

    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将同样生成自己的渲染线程,因此与本机代码的相同类型的交互是要避免的。但是,通过这些提示,您应该能够同步这些线程并使其完美地工作;)