2010-03-08 246 views
2

我在C++「監聽器類」(或多或少)中調用了一些Java對象的某個函數。我懷疑有內存泄漏:實現JNI監聽器

JNIEnv *env = NULL; 
vm_->AttachCurrentThread(&env, NULL); 
const jclass cls = env->FindClass(...); 
const jmethodID meth = env->GetMethodID(...); 
const jobject obj = env->NewObject(cls, meth, ...); 

[ more code ] 

env->DeleteLocalRef(obj); 

我的問題是:我應該也釋放CLS甲基本地參考? JNI文檔不太清楚。

回答

2

不,不需要這樣做。沒有爲這兩個變量分配堆,它們只對當前方法是本地的,並且不必是free'd或某物。作爲一個經驗法則,您必須刪除使用名稱中包含New的方法創建的JNI對象,例如,使用名稱爲New的方法創建JNI對象。

env->NewStringUTF(...) 
env->NewObjectArray(...) 
env->NewObject(...) 

因爲這些方法都轉化爲在堆(newmalloc

+0

由於某種內存分配。看來內存泄漏是在我鏈接到的本地庫中,而不是在我的JNI代碼中。 無論如何,我剛剛發現了Push/PopLocalFrame(),並且使用它們要比釋放每個本地引用容易得多。 – 2010-03-18 08:33:25