【发布时间】:2012-02-20 23:19:21
【问题描述】:
我有以下 JNI 方法,它在本地创建 Java 对象的集合,然后将它们返回给 Java:
JNIEXPORT jobject JNICALL Java_com_test_myClass_myMethod(JNIEnv * env, jclass klass) {
jclass arrayClass = env->FindClass("java/util/ArrayList");
jmethodID initMethod = env->GetMethodID(arrayClass, "<init>", "()V");
jmethodID addMethod = env->GetMethodID(arrayClass, "add", "(Ljava/lang/Object;)Z");
jobject myArray = env->NewObject(arrayClass, initMethod);
env->CallBooleanMethod(myArray, addMethod, env->NewStringUTF("Hello"));
env->CallBooleanMethod(myArray, addMethod, env->NewStringUTF("World"));
return myArray;
}
我需要释放在本机代码中创建的对象,还是由 GC 自动完成? 如果我这样做,我该怎么做,因为我需要将它返回给 Java?
【问题讨论】:
-
我认为这将取决于本机代码来进行自己的内存管理。在这种情况下,我想您需要添加另一个本机方法来释放分配的对象,当您完成它们时手动调用它们。更一般地说,如果您正在使用 JNI 做事,那么我希望您已经为一个充满伤害的世界做好了准备。这个答案可能会有所帮助:stackoverflow.com/questions/214699/…
-
@aroth - 错误。如果你在 JNI 中分配 Java 对象,它们是 Java 对象,归 GC 所有。
-
@bmargulies - 有道理,但是对于分配非 Java 对象/内存的本机代码,例如通过调用
malloc()呢? -
@aroth 不是这个问题的意思。
标签: java c++ memory-management memory-leaks java-native-interface