2011-08-17 127 views
2

跨多個JNI調用緩存JNIEnv對象是否安全?例如,我可以這樣做你可以緩存JNIEnv嗎?

void foo(JNIEnv* env) 
{ 
    static JNIEnv* cached; 
    if(! cached) 
     cached = env; 

    /* use cached */ 
} 

當然,我在現實中的代碼沒有什麼這個愚蠢的,但上面的例子確實說明使用情況良好。

回答

3

是的,你可以,但只能在一個線程內。你的緩存不能像上面那樣簡單,除非你確定,不管怎樣,你的本地代碼只能在單個線程上調用。否則,你需要使用線程本地存儲來保存你的JNIEnv引用。

+0

確實。實際上,我將JNIEnv緩存在一個結構體中,並且該結構體只能從創建它的線程中使用。 –