Android ndk绑定线程导致应用程序中出现问题



我有这个应用程序(只有一个活动),它使用一些android UI和一些原生C++库来绘制和计算OpenGl。

这个活动似乎自己创建了一些"绑定线程",我很确定它会导致我的本地调用出现一些损坏。

装订线是什么?它们可以被删除或合并为一个吗?

终于找到了一些关于这个主题的好信息。

  • 绑定线程不能被删除或合并,但通过使用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中同步您的代码,以最大限度地减少奇怪的行为。(详细信息)

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

最新更新