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

相關問題