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.

Schreibe einen Kommentar