Утечка памяти с параметром jobjectarray - PullRequest
0 голосов
/ 07 сентября 2018

У меня есть метод jni, который принимает в качестве параметра массив объектов Paths. В этом коде есть утечка памяти в успешном пути. Я подозреваю, что это происходит из-за того, что класс jobject не был освобожден, но не могу понять, как освободить эту память. Вот некоторые выдержки из кода:

static jclass pathClass;
static jmethodID pathMethod;

jint JNI_OnLoad(JavaVM* vm, void* reserved) {
    JNIEnv* env;
    if ((*vm)->GetEnv(vm, (void **) &env, JNI_VERSION_1_8) != JNI_OK) {
        return JNI_ERR;
    }
    jclass localPathClass = (*env)->FindClass(env, "java/nio/file/Path");
    if (localPathClass == NULL || (*env)->ExceptionOccurred(env)) {
        return JNI_ERR;
    }
    pathClass = (jclass) (*env)->NewGlobalRef(env, localPathClass);
    if (pathClass == NULL || (*env)->ExceptionOccurred(env)) {
        return JNI_ERR;
    }
    pathMethod = (*env)->GetMethodID(env, pathClass, "toString", "()Ljava/lang/String;");
    if (pathMethod == NULL || (*env)->ExceptionOccurred(env)) {
        return JNI_ERR;
    }
}

void JNI_OnUnload(JavaVM *vm, void *reserved) {
    //printf("Unloading jni library...\n");
    JNIEnv* env;
    if ((*vm)->GetEnv(vm, (void **) &env, JNI_VERSION_1_8) != JNI_OK) {
        // Something is wrong but nothing we can do about this :(
        return;
    } else {
        if (pathClass != NULL) {
            (*env)->DeleteGlobalRef(env, pathClass);
        }
    }
}

JNIEXPORT jint JNICALL Java_test(JNIEnv *env, jobject obj, jobjectArray params) {
    jsize numParams = (*env)->GetArrayLength(env, params);
    int i;
    for (i=0; i < numParams; i++) {
        jobject param = (*env)->GetObjectArrayElement(env, params, i);
        jstring jniStr = (jstring) (*env)->CallObjectMethod(env, param, pathMethod);
        const char *path = (*env)->GetStringUTFChars(env, jniStr, NULL);
        // some handling
        (*env)->ReleaseStringUTFChars(env, param, path);
    }
    (*env)->DeleteLocalRef(env, params);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...