2013-05-18 25 views
7

我從JNI方法返回一個jstring。在返回值之前,我刪除了對它的本地引用。在Java本地接口中調用DeleteLocalRef

JNIEXPORT jstring JNICALL TestJNIMethod(JNIEnv* env, jclass) 
{ 
    jstring test_string = env->NewStringUTF("test_string_value"); 
    env->DeleteLocalRef(test_string); 
    return test_string; 
} 

調用JAVA方法仍然能夠訪問返回的jstring或垃圾收集器是否會清理內存?

回答

18

不,它不會,但是您的代碼將在比ICS更早的Android版本上運行。來自ICS的這段代碼將正確地失敗。

一般來說,您不需要自己刪除本地引用,一旦JNI函數返回到Java引用將得到GC'd。

例外該規則是,如果你創建了很多人,也許是在一個循環。然後可以填寫本地參考表。請參閱IBM: Overview of JNI object references

你應該閱讀JNI Local Reference Changes in ICS。即使你不是爲Android編寫代碼,它仍然會識別許多常見的錯誤。