2
我有一個使用多線程(例如,ui線程聯網線程)的android應用程序。現在我想讓這兩個線程調用本地函數。另外一些本地函數會調用java函數。在多線程應用程序中緩存JNI環境
對於這個JNIEnv*
是必需的,它不同於線程。但我認爲GetEnv()
的效率相當低。
有沒有辦法爲每個線程緩存JNIEnv*
,然後確定在哪個線程中(在本地函數中)使用正確的緩存JNIEnv*
?
我有一個使用多線程(例如,ui線程聯網線程)的android應用程序。現在我想讓這兩個線程調用本地函數。另外一些本地函數會調用java函數。在多線程應用程序中緩存JNI環境
對於這個JNIEnv*
是必需的,它不同於線程。但我認爲GetEnv()
的效率相當低。
有沒有辦法爲每個線程緩存JNIEnv*
,然後確定在哪個線程中(在本地函數中)使用正確的緩存JNIEnv*
?
您不能緩存JNIEnv,並且應該在緩存的JVM *上使用AttachCurrentThread()。如果本地線程已經連接,我相信這個功能相當於一個NOOP。
if ((*jvm)->AttachCurrentThread(jvm, (void **)(&env), NULL) == JNI_OK) {
....
}
謝謝! 'AttachCurrentThread()'的性能怎麼樣?它顯着慢嗎? – Uroc327
如果線程已經連接,其快如no-op指令。所以,它的速度和它的速度一樣快。有可能,如果你需要連接到一羣新創建的線程的性能問題,但是,我懷疑,JNI是在這一點上你的瓶頸。 –
很高興知道!謝謝! – Uroc327