2010-03-08 173 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