我有這個應用程序(只有一個活動),使用一些Android用戶界面和一些本地C++庫做OpenGl繪圖和計算。Android ndk綁定程序線程導致應用程序出現問題
這似乎是活動創建了自己的「綁定線程」,我敢肯定它會在我的本地調用中導致一些錯誤。
什麼是活頁夾線程? 他們可以被刪除或合併成一個?
我有這個應用程序(只有一個活動),使用一些Android用戶界面和一些本地C++庫做OpenGl繪圖和計算。Android ndk綁定程序線程導致應用程序出現問題
這似乎是活動創建了自己的「綁定線程」,我敢肯定它會在我的本地調用中導致一些錯誤。
什麼是活頁夾線程? 他們可以被刪除或合併成一個?
終於找到了一些關於這個問題的好消息。
連結線不能被刪除或合併,但你可以重定向功能通過使用Handler
和Runnable
對象調用到主線程很容易地。
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
}
});
如果使用GLSurfaceView
像我這樣做,你也可以重定向代碼到GL螺紋
myGLSurfaceView.queueEvent(new Runnable()
{
@Override public void run()
{
/* do something on the GLSurfaceView thread */
}});
需要注意的是,android總是爲UI創建一個單獨的線程,因此從UI代碼和其他地方調用本機代碼顯然會導致意外的行爲。
此外,使用GLSurfaceView
將同樣生成自己的線程進行渲染,因此與本機代碼的相同類型的交互是避免的。但是,有了這些提示,你應該能夠同步這些線程,並使其工作完美無缺;)
+1優秀的信息,謝謝。 – occulus 2011-12-20 19:11:45
這也有一些有用的建議: http://blogs.arm.com/software-enablement/238-10-android-ndk-tips/ – occulus 2011-12-20 19:23:42
當然: http://developer.android.com/guide /topics/fundamentals/processes-and-threads.html – occulus 2011-12-20 19:26:33