Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android ndk binder线程导致应用程序出现问题 我有一个应用程序(只有一个活动),使用Android的UI和一些本地C++的LIB来进行OpenGL的绘制和计算。_Android_Android Layout_Android Widget_Android Ndk_Android Manifest - Fatal编程技术网

Android ndk binder线程导致应用程序出现问题 我有一个应用程序(只有一个活动),使用Android的UI和一些本地C++的LIB来进行OpenGL的绘制和计算。

Android ndk binder线程导致应用程序出现问题 我有一个应用程序(只有一个活动),使用Android的UI和一些本地C++的LIB来进行OpenGL的绘制和计算。,android,android-layout,android-widget,android-ndk,android-manifest,Android,Android Layout,Android Widget,Android Ndk,Android Manifest,看起来这个活动自己创建了一些“绑定线程”,我很确定它会导致我的本地调用中的一些损坏 什么是装订线? 它们可以被删除或合并成一个吗?终于找到了一些关于这个主题的好信息 绑定线程不能被删除或合并,但是通过使用处理程序和可运行的对象,您可以很容易地将函数调用重定向到主线程中 Handler handle = new Handler(); //Will be associated with current thread handle.post(new Runnable () { @Overri

看起来这个活动自己创建了一些“绑定线程”,我很确定它会导致我的本地调用中的一些损坏

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

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

  • 绑定线程不能被删除或合并,但是通过使用
    处理程序
    可运行的
    对象,您可以很容易地将函数调用重定向到主线程中

    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内同步您的代码,以最小化奇怪的行为。()

  • 您还可以重定向要在UI线程内执行的部分代码(如果您希望在UI上获得性能,我不建议这样做)

  • 如果像我一样使用
    GLSurfaceView
    ,还可以将代码重定向到GL线程中

    myGLSurfaceView.queueEvent(new Runnable()
    {
        @Override public void run() 
        {
            /* do something on the GLSurfaceView thread */
    }});
    
需要注意的是,android总是会为UI创建一个单独的线程,因此从您的UI代码和其他地方调用本机代码显然会导致意外行为


另外,使用
GLSurfaceView
同样会生成自己的渲染线程,因此要避免与本机代码的相同交互。但是,有了这些提示,您应该能够同步这些线程并使其完美地工作;)

这也有一些有用的建议:当然,注意处理程序并不局限于UI线程。您可以随时创建新的HandlerThread,并在该线程上运行post()。
myActivity.runOnUiThread(new Runnable ()
{
    @Override public void run()
    {
    // Your code 
    }
});
myGLSurfaceView.queueEvent(new Runnable()
{
    @Override public void run() 
    {
        /* do something on the GLSurfaceView thread */
}});