NewGlobalRef/DeleteGlobalRef bei der Rückgabe erzeugte Objekt in JNI
Bei der Rückkehr Verweis auf Objekt erstellt, in der JNI-Methode, um Java -, sollten wir zurückkehren Ergebnis NewGlobalRef nennen erstellten Objekt? Und, beziehungsweise, später, wenn Objekt nicht mehr benötigt Java, brauchen wir rufen JNI-Methode zu tun DeleteGlobalRef auf die Referenz übergeben von Java?
Oder NewGlobalRef/DeleteGlobalRef nur erforderlich, um die Verweise auf Java-Objekt in JNI, zwischen JNI Aufrufe von Methoden, und wenn wir einfach zurück erstellte Objekt Java wir brauchen nicht zu tun, NewGlobalRef/DeleteGlobalRef Anrufe?
Ich habe gesehen, so etwas in eine große open-source-Projekt:
extern "C" JNIEXPORT jobject JNICALL
Java_foo_bar_Baz_create(JNIEnv* env, jclass, jint size) {
void* buf = malloc(size);
jobject obj = env->NewDirectByteBuffer(buf, size);
return env->NewGlobalRef(obj);
}
extern "C" JNIEXPORT void JNICALL
Java_foo_bar_Baz_free(JNIEnv* env, jclass, jobject jbuffer) {
void* buf = env->GetDirectBufferAddress(jbuffer);
free(buf);
}
Rückkehr Ergebnis NewGlobalRef Aufruf erstellt am NewDirectByteBuffer Objekt, und später, wenn Objekt nicht mehr benötigt, in Java gibt es einen Aufruf von JNI-Methode, die nicht anrufen DeleteGlobalRef, aber rufen Sie einfach kostenlos() auf die native Puffer-Adresse.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nur, wenn Sie auch behalten wollen, die Referenz für die Verwendung in zukünftigen JNI-Aufrufe, ohne dass es wieder als ein JNI-Methode-parameter.
Nur, wenn Sie angerufen
NewGlobalRef()
drauf.Absolut richtig.
Wieder richtig zu stellen.
Begründen, die ein Leck der
DirectByteBuffer
Objekt, aber nicht von seiner systemeigenen Puffer.