tôi có phương pháp JNI sau đó tạo ra một tập hợp các đối tượng Java natively, và sau đó trả lại cho Java:JNI đối tượng sáng tạo và quản lý bộ nhớ
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;
}
Tôi có cần phải giải phóng các đối tượng được tạo ra trong mã nguồn gốc , hoặc nó được thực hiện tự động bởi GC? Nếu tôi làm, làm cách nào để làm điều đó, vì tôi cần trả lại nó cho Java?
Tôi nghĩ rằng sẽ tùy thuộc vào mã nguồn gốc để thực hiện quản lý bộ nhớ riêng của mình. Trong trường hợp này, tôi tưởng tượng rằng bạn cần thêm một phương thức gốc khác để giải phóng (các) đối tượng được cấp phát mà bạn gọi theo cách thủ công khi bạn đã thực hiện xong chúng. Nói chung, nếu bạn đang làm việc với JNI thì tôi hy vọng bạn chuẩn bị cho một thế giới bị tổn thương. Câu trả lời này có thể giúp: http://stackoverflow.com/questions/214699/jni-memory-management-using-the-invocation-api – aroth
@aroth - sai. nếu bạn phân bổ đối tượng Java trong JNI, chúng là các đối tượng Java, thuộc sở hữu của GC. – bmargulies
@bmargulies - Làm cho tinh thần, nhưng những gì về trong trường hợp của mã nguồn gốc phân bổ các đối tượng/bộ nhớ không Java, ví dụ bằng cách gọi 'malloc()'? – aroth