我在c ++“监听器类”(或多或少)中有以下代码,它调用Java对象的某些功能。我怀疑有内存泄漏:
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 和 meth 的本地参考? JNI文档对此并不十分清楚。
答案 0 :(得分:2)
不,没有必要这样做。没有为这两个变量分配堆,它们只是当前方法的本地,不必是免费的或其他东西。
根据经验,您必须删除使用名称中包含New
的方法创建的JNI对象,例如
env->NewStringUTF(...)
env->NewObjectArray(...)
env->NewObject(...)
因为这些方法都转换为堆上的某种内存分配(new
,malloc
)