代码之家  ›  专栏  ›  技术社区  ›  G B

实现JNI侦听器

  •  2
  • G B  · 技术社区  · 15 年前

    我在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 甲基 ?jni文档对此不是很清楚。

    1 回复  |  直到 15 年前
        1
  •  2
  •   David Sauter    15 年前

    不,没有必要这样做。没有为这两个变量分配堆,它们只是当前方法的本地变量,不必是free'd之类的。

    根据经验,您必须删除使用以下方法创建的JNI对象 New 以它的名义,例如。

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

    因为这些方法都转换成堆上的某种内存分配( new , malloc )