Cuando estoy construyendo un objeto java usando métodos JNI, para pasarlo como un parámetro a un método java invocando usando la API de invocación JNI, ¿cómo manejo su ¿memoria?Administración de memoria JNI usando la API de invocación
Esto es lo que estoy trabajando con:
Tengo un objeto de C que tiene un método destructor que es más complejo que free()
. Este objeto C debe asociarse con un objeto Java, y una vez que la aplicación finaliza con el objeto Java, ya no necesito el objeto C.
estoy creando el objeto Java como tal (comprobación de errores elided para mayor claridad):
c_object = c_object_create();
class = (*env)->FindClass (env, "my.class.name");
constructor = (*env)->GetMethodID (env, class, "<init>", "(J)V");
instance = (*env)->NewObject (env, class, constructor, (jlong) c_object);
method = (*env)->GetMethodID (env, other_class, "doSomeWork", "(Lmy.class.name)V");
(*env)->CallVoidMethod (env, other_class, method, instance);
Así que, ahora que he terminado con instance
, ¿qué hago con ella? Idealmente, me gustaría dejar la recolección de basura en la VM; cuando se hace con instance
sería fantástico si también llamara c_object_destroy()
en el puntero que le proporcioné. es posible?
Una pregunta separada pero relacionada tiene que ver con el alcance de las entidades Java que creo en un método como este; ¿Tengo que liberar manualmente, por ejemplo, class
, constructor
, o method
arriba? El documento de JNI es frustrantemente vago (a mi juicio) sobre el tema de la gestión adecuada de la memoria.
Son esos aspectos específicos que necesitaba aclarar, lamentablemente :) No sé si alguna vez ha intentado ejecutar una JVM en valgrind (una herramienta de comprobación de memoria de Linux) pero tiene tantas operaciones sospechosas que es imposible leer el salida, así que claro documento sobre cómo funcionan las asignaciones de memoria es fundamental. –
En realidad, tengo. Intenté ejecutar Eclipse en Valgrind y fallé: http://stackoverflow.com/questions/189284/running-eclipse-under-valgrind. – JesperE