У меня есть метод 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);
}