Lo que quiero decir es que si creo un jobject de referencia global en C++, y luego transfiero eso a algún código Java, y elimino la llamada DeleteGlobalRef(), ese objeto java subyacente es posiblemente recolectado inmediatamente, de modo que cualquier Java futuro El código que ya se está refiriendo a ese objeto podría regresar con una NullPointerException? En concreto, si tengo algo de código C++ que hace algo como este ejemplo simplificado:Si se llama a JNI DeleteGlobalRef(), ¿el objeto java correspondiente obtiene basura recolectada?
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?
¿Cómo funciona esto en la JNI? Es una "referencia global" en un objeto solo un recuento de referencia para el objeto, de modo que si libero el jobject de GlobalReference, no necesariamente recoge el objeto java subyacente hasta que todas las referencias al mismo (como el objeto "principal" otro referencia existente de ReListGlobal)) se han ido?
Si puede responder esto y proporcionar un enlace a alguna documentación oficial de Java/Sun/Oracle que respalde su respuesta, obtendrá un premio adicional :-).
Es posible que desee leer https://developer.android.com/training/articles/perf-jni.html? Mencionan algunos consejos útiles sobre este tema. –