2014-04-21 48 views
2

我有一個使用多線程(例如,ui線程聯網線程)的android應用程序。現在我想讓這兩個線程調用本地函數。另外一些本地函數會調用java函數。在多線程應用程序中緩存JNI環境

對於這個JNIEnv*是必需的,它不同於線程。但我認爲GetEnv()的效率相當低。

有沒有辦法爲每個線程緩存JNIEnv*,然後確定在哪個線程中(在本地函數中)使用正確的緩存JNIEnv*

回答

0

您不能緩存JNIEnv,並且應該在緩存的JVM *上使用AttachCurrentThread()。如果本地線程已經連接,我相信這個功能相當於一個NOOP。

if ((*jvm)->AttachCurrentThread(jvm, (void **)(&env), NULL) == JNI_OK) { 
    .... 
} 
+0

謝謝! 'AttachCurrentThread()'的性能怎麼樣?它顯着慢嗎? – Uroc327

+0

如果線程已經連接,其快如no-op指令。所以,它的速度和它的速度一樣快。有可能,如果你需要連接到一羣新創建的線程的性能問題,但是,我懷疑,JNI是在這一點上你的瓶頸。 –

+0

很高興知道!謝謝! – Uroc327