2

我有这个应用程序(只有一个活动),使用一些Android用户界面和一些本地C++库做OpenGl绘图和计算。Android ndk绑定程序线程导致应用程序出现问题

这似乎是活动创建了自己的“绑定线程”,我敢肯定它会在我的本地调用中导致一些错误。

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

回答

4

终于找到了一些关于这个问题的好消息。

  • 连结线不能被删除或合并,但你可以重定向功能通过使用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. 
        } 
    }); 
    
  • 但是,您不能在您的本机代码中使用它。所以有可能你的一些本地代码会产生意想不到的错误。为此,您可以在JNI内同步代码以最小化怪异行为。 (details

    env->MonitorEnter(obj); 
    // Your code 
    env->MonitorExit(obj); 
    
  • 您也可以,您重定向代码的某些部分到UI线程里面执行

    myActivity.runOnUiThread(new Runnable() 
    { 
        @Override public void run() 
        { 
        // Your code 
        } 
    }); 
    
  • (我,如果你想在UI上的表现不推荐)

    如果使用GLSurfaceView像我这样做,你也可以重定向代码到GL螺纹

    myGLSurfaceView.queueEvent(new Runnable() 
    { 
        @Override public void run() 
        { 
         /* do something on the GLSurfaceView thread */ 
    }}); 
    

需要注意的是,android总是为UI创建一个单独的线程,因此从UI代码和其他地方调用本机代码显然会导致意外的行为。

此外,使用GLSurfaceView将同样生成自己的线程进行渲染,因此与本机代码的相同类型的交互是避免的。但是,有了这些提示,你应该能够同步这些线程,并使其工作完美无缺;)

+0

+1优秀的信息,谢谢。 – occulus 2011-12-20 19:11:45

+0

这也有一些有用的建议: http://blogs.arm.com/software-enablement/238-10-android-ndk-tips/ – occulus 2011-12-20 19:23:42

+0

当然: http://developer.android.com/guide /topics/fundamentals/processes-and-threads.html – occulus 2011-12-20 19:26:33

相关问题