Estoy usando la API de invocación JNI, que inicia una JVM dentro de un programa C; en esta situación, obtienes un puntero JNIEnv que sigue siendo válido hasta que destruyas explícitamente la JVM. ¿La distinción local/global todavía se aplica aquí? ¿Cuál es el significado de una referencia local a un objeto recién creado, ya que el JNIEnv permanece en el alcance todo el tiempo?Referencias de objeto JNI obtenidas a través de la API de invocación: ¿local o global?
Respuesta
El libro JNI es un poco escueta acerca de esta situación, pero puedes averiguarlo si lo estudias lo suficiente. Básicamente, cuando adjunta un hilo de C nativo a la JVM, crea un contexto local que puede almacenar algunas referencias locales.
Estas referencias locales serán nunca liberadas hasta que las libere manualmente con DeleteLocalRef, o destruya el contexto local llamando a DetachThread. Debido a que probablemente no esté conectando y desconectando muchas JVM, es muy importante que llame a DeleteLocalRef en cada referencia local que cree.
La siguiente pregunta natural es "¿por qué crear refs globales en absoluto, si los refs locales no reciben GC'ed hasta que la JVM se separe?" Bueno, las referencias locales no se pueden compartir entre hilos. Por lo tanto, aún debe crear referencias globales para hacer eso.
Creo que el hilo que creó JVM se convierte en hilo de Java, que, como cualquier hilo creado en Java, o conectado a través de AttachCurrentThread(), tiene su marco de pila local. Por lo tanto, cualquier objeto que cree se convierte en una referencia local en este marco de pila, que caducará cuando destruya JVM (no puede separar el hilo principal) o llame a DeleteLocalRef().
¿Tiene alguna referencia de documentación sobre esto? ¿Y es legal pasar tales referencias locales a otros JNIEnv obtenidos cuando Java realiza una llamada C nativa? – Flavio
Probablemente una llamada DettachCurrentThread() libera las referencias también. Desafortunadamente la especificación JNI no define claramente el comportamiento de las referencias de la API de invocación, y puede ser que la semántica reales dependerán de la aplicación específica JVM: S
- 1. Administración de memoria JNI usando la API de invocación
- 2. Devolver una clase C++ a Java a través de JNI
- 3. ¿Qué es 'Referencia global JNI'
- 4. ¿Habilitar/deshabilitar monitores múltiples a través de la API de Win32 o la API de NVidia?
- 5. Compartir flujos de salida a través de una interfaz JNI
- 6. Pasando punteros entre C y Java a través de JNI
- 7. escritura a la memoria global o local aumenta el tiempo de ejecución del kernel por 10.000%
- 8. Acceder a una variable (local o global) del archivo PHP de smarty
- 9. ¿Cuáles son las referencias mundiales débiles? ¿Cómo es diferente de una referencia global?
- 10. pasar punteros entre C y Java a través de JNI
- 11. NHibernate crea proxy a través de session.Load(), pero no a través de API de Criterios o de Linq
- 12. La invocación ChangePassword con objeto DirectoryEntry
- 13. ¿Cómo obtener el objeto concreto de un método estático a través de la API reflejada?
- 14. Invocación de un método en un objeto
- 15. Controlando Skype a través de la API COM de Skype4COM.dll
- 16. convertir la variable local de JavaScript en la variable global
- 17. objeto de clase Invocación System.Delegate en C#
- 18. Cómo acceder a la API RESTful a través de PHP
- 19. Verificar usuario a través de la API GetVerifiedStatus de PayPal
- 20. Transferencia de cadenas de doble byte (WCHAR) de C++ a Java a través de JNI
- 21. Mapeo global/local Qt QPoint
- 22. Android: JNI ERROR (error de la aplicación): desbordamiento de la tabla de referencia local (max = 512)
- 23. C++: ¿por qué no podemos tener referencias a referencias o matriz de referencias?
- 24. Android NDK desborda dalvik JNI tabla de referencia local
- 25. Obtener el nombre de la ubicación de las coordenadas obtenidas
- 26. Llamar a un archivo DLL desde un applet a través de JNI
- 27. recuento automático de referencias Problema: Pasar la dirección del objeto no local a __autoreleasing parameter for write-back
- 28. invocación de método "dinámico" con el nuevo Scala API reflexión
- 29. temporizador objeto local Gestor de Eventos
- 30. AWS S3 objeto ciclo de vida a través de Boto
+1: Esta es la mejor respuesta aquí. –
Ahora que tengo más experiencia en JNI, estoy de acuerdo en que esta es la respuesta más clara. – Flavio
El comentario sobre los refs locales que nunca se liberan muestra la sutileza de utilizar JNI: si convierte una referencia local en una referencia global, asegúrese de eliminar la referencia local más adelante. De lo contrario, la referencia local no se eliminará y tendrá una pérdida de memoria. –