Was ich meine ist, wenn ich ein globales Referenz-Projekt in C++ erstellen, und dann an einige Java-Code übergeben, und Löschen löschen DeleteGlobalRef(), ist das zugrunde liegende Java-Objekt möglicherweise Müll sofort gesammelt, so dass jede zukünftige Java Code, der bereits auf dieses Objekt verweist, könnte mit einer NullPointerException zurückkommen? Genauer gesagt, wenn ich einige C++ Code, der so etwas wie dieses vereinfachte Beispiel tut:Wenn JNI DeleteGlobalRef() aufgerufen wird, wird das entsprechende Java-Objekt Garbage Collected gesammelt?
static jobject myObjGlobalRef;
static JNIEnv* env = /* call to create a JVM and get the JNI env */;
jobject ReturnMyObj()
{
/* <<Code that defines class, constructorId, and param1 goes here>> */
jobject localObj = env->NewObject(class, constructorId, param1);
myObjGlobalRef = env->NewGlobalRef(localObj);
}
void DeleteMyObj()
{
env->DeleteGlobalRef(myObjGlobalRef);
}
myObjGlobalRef = ReturnMyObj();
jobject otherExistingGlobalRef = /* Assume we get another global ref to another parent obj somewhere else */
/* ... other code here ... */
// Invoke some method on some other pre-existing global reference that uses
// myObjGlobalRef, lets assume this method stores the object referenced by
// myObjGlobalRef into a parent object referenced by otherExistingGlobalRef:
env->CallVoidMethod(env, otherExistingGlobalRef, addASubObjectMethodId, myObjGlobalRef);
DeleteMyObj();
// Does the pointed to by myObjGlobalRef still exist here, assuming that
// otherExistingGlobalRef now references it?
Wie funktioniert das in JNI? Ist eine "GlobalReference" für ein Objekt nur eine Referenzzählung für das Objekt, so dass wenn ich das GlobalReference-Projekt freigebe, es nicht unbedingt Garbage das zugrunde liegende Java-Objekt sammelt, bis alle Verweise darauf (z. B. das "Eltern" -Objekt andere ExistingGlobalRef Referenzierung es) sind weg?
Wenn Sie dies beantworten können und einen Link zu einigen offiziellen Java/Sun/Oracle-Dokumenten zur Verfügung stellen, die Ihre Antwort unterstützen, erhalten Sie ein Bonus-Lob :-).
Sie möchten vielleicht https://developer.android.com/training/articles/perf-jni.html lesen? Sie erwähnen einige nützliche Tipps zu diesem Thema. –