JNI-Objekte Erstellung und Speicher-management
Habe ich Folgendes JNI-Methode, erstellt eine Sammlung von Java-Objekten nativ, und dann wieder zurück zu 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;
}
Brauche ich, um die erstellten Objekte in den native code, oder ist es automatisch mit dem GC?
Wenn ich das mache, wie mache ich das, wie ich brauche, um Sie wieder in Java?
Ich würde denken, dass es bis zu den native code zu tun, seine eigene Speicherverwaltung. In diesem Fall würde ich mir vorstellen, dass Sie würde müssen, fügen Sie eine andere native Methode, die Versionen der zugewiesenen Objekt(en), die Sie manuell aufrufen, wenn Sie fertig sind mit Ihnen. Generell, wenn Sie Dinge, die Sie mit JNI dann hoffe ich, Sie sind bereit für eine Welt voller Schmerzen. Diese Antwort kann helfen: stackoverflow.com/questions/214699/...
falsch. wenn Sie reservieren Java-Objekt in JNI, Sie sind Java-Objekte, die im Besitz der GC.
Macht Sinn, aber was ist im Fall der native code, der die Zuweisung der nicht-Java-Objekte/Speicher, zum Beispiel durch den Aufruf
nicht, was diese Frage betrifft.
falsch. wenn Sie reservieren Java-Objekt in JNI, Sie sind Java-Objekte, die im Besitz der GC.
Macht Sinn, aber was ist im Fall der native code, der die Zuweisung der nicht-Java-Objekte/Speicher, zum Beispiel durch den Aufruf
malloc()
?nicht, was diese Frage betrifft.
InformationsquelleAutor nbarraille | 2012-02-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Brauchen Sie nicht, um die Java-Objekte erstellt, die in den nativen code. In der Tat, können Sie nicht. Der garbage collector kann das Objekt freigeben, wenn keine weiteren Verweise bleiben.
Gelegentlich ist es sinnvoll in nativen code frei Referenzen zu Java-Objekten. Dies reduziert den Speicherbedarf, wenn die den nativen code enthält, aber nicht mehr braucht, Verweise auf große Objekte oder eine große Anzahl von Referenzen.
Aus: "Globale und lokale Referenzen" in der JNI-Spezifikation.
Zusätzlichen Details versehen wurde
Sehen "Die Befreiung Referenzen" in der JNI Programmer ' s Guide.
Die lokalen Referenzen werden automatisch freigegeben, nach jedem Aufruf. Sie nicht haben, um es explizit tun, es sei denn, 1) Sie haben eine Globale Referenz, oder 2) müssen Kostenlose lokale Referenzen, bevor der Anruf abgeschlossen ist, für einen Grund, beschrieben in dem link. Die Referenz, die Sie zurückgeben, wird kopiert. Beide myArray und die zurückgegebene Referenz auf das gleiche Java Objekt.
link ist tot ...
Neuer link: Bücher.google.co.il/...
Die google-books-link ist auch tot jetzt. Sun docs finden Sie auf der internet-Archiv: web.archive.org/web/20070812015712/http://java.sun.com/docs/... (Abschnitt 5.2 ist der "Befreiung Referenzen").
InformationsquelleAutor Andy Thomas