tengo el siguiente método JNI que crea una colección de objetos Java de forma nativa, y luego devolverlos a Java:JNI objetos creación y gestión de memoria
JNIEXPORT jobject JNICALL Java_com_test_myClass_myMethod(JNIEnv * env, jclass klass) {
jclass arrayClass = env->FindClass("java/util/ArrayList");
jmethodID initMethod = env->GetMethodID(arrayClass, "<init>", "()V");
jmethodID addMethod = env->GetMethodID(arrayClass, "add", "(Ljava/lang/Object;)Z");
jobject myArray = env->NewObject(arrayClass, initMethod);
env->CallBooleanMethod(myArray, addMethod, env->NewStringUTF("Hello"));
env->CallBooleanMethod(myArray, addMethod, env->NewStringUTF("World"));
return myArray;
}
¿Es necesario para liberar los objetos creados en el código nativo , o es hecho automáticamente por el GC? Si lo hago, ¿cómo hago eso, ya que necesito devolverlo a Java?
Creo que correspondería al código nativo realizar su propia gestión de memoria. En este caso, me imagino que necesitaría agregar otro método nativo que libera los objetos asignados, a los que llama manualmente cuando termina con ellos. En términos más generales, si estás haciendo cosas con JNI, entonces espero que estés preparado para un mundo de dolor. Esta respuesta puede ayudar: http://stackoverflow.com/questions/214699/jni-memory-management-using-the-invocation-api – aroth
@aroth - wrong. si asigna objetos Java en JNI, son objetos Java, propiedad del GC. – bmargulies
@bmargulies - Tiene sentido, pero ¿qué ocurre con el código nativo que asigna objetos/memoria que no son Java, por ejemplo al invocar 'malloc()'? – aroth