Android NDK: ¿Cómo limpiar el código nativo después de reiniciar la actividad?
Todas,
Soy consciente de que, por defecto, una actividad se eliminará y se reiniciará cuando cambie la orientación de la pantalla, o se deslice un teclado dentro o fuera. (Véase Reinicio actividad en rotación Android ). Mi pregunta es, ¿cuál es la manera correcta de manejar esto desde una perspectiva de código nativo? Por ejemplo, si tengo un bloque estático cargando una biblioteca nativa y mi aplicación se reinicia, ¿cómo puedo asegurarme de que cualquier memoria en la tierra natal sea tratada apropiadamente? El problema es
- Cómo deshabilitar la aplicación nativa de Facebook para el inicio de sesión de usuario
- Cómo guardar anotaciones en pdf protegido por contraseña usando MuPDF
- ¿Cómo utilizar la actividad nativa? ¿Se puede combinar con la actividad tradicional?
- Cómo guardar la entrada en el calendario nativo (Android e iOS) en reaccionar nativo?
- Código Nativo de Android C ++
Cuando giramos el dispositivo, parece que se ha creado un grupo de hilos independiente y los antiguos nunca se eliminan. Esto significa que cada vez que alguien enciende el dispositivo, tenemos una tonelada de más hilos sentados inactivos y ocupando la memoria
¿Cómo puedo asegurar que esto no suceda? Veo desde la página de JNIExample algunas notas en la parte inferior:
[*] Problemas no resueltos y errores Aunque el ejemplo es completamente funcional, hay un par de problemas sin resolver que no he podido averiguar hasta ahora. Aparecen problemas al iniciar la actividad, luego presione el botón Atrás para ocultarlo y, a continuación, inícielo de nuevo. En mi experiencia, las llamadas a funciones nativas en tal actividad reiniciada fallarán espectacularmente. CallVoid () simplemente se bloquea con un error de segmentación, mientras que las llamadas a getNewData () y getDataString () hacen que JVM aborte con un error, ya que ya no está satisfecho con la referencia de objeto en caché global. Parece que el reinicio de la actividad de alguna manera invalida nuestras referencias de objeto en caché, aunque están protegidas con NewGlobalRef (), y la actividad se está ejecutando dentro de la JVM original (el reinicio de la actividad no significa que JVM se reinicie). No tengo una buena explicación de por qué sucede, así que si tienes alguna idea, por favor avísame.
¿Se ha resuelto esto?
- Código nativo de C / C ++ en una plataforma Android
- Diferencia entre NativeCameraView y JavaCameraView en OpenCV
- Android NDK + GDB
- ¿Cómo escribir el programa de servidor nativo nativo (no aplicación) para dispositivos Android?
- No se encontró ninguna implementación para los nativos
- ¿Es posible crear elementos de interfaz de usuario con el NDK? - falta de especificaciones en documentos Android
- No se puede conectar al depurador de cromo desde Device / Genymotion
- Ganancia nativa en Android Client
Reiniciar en Android NDK es molesto. Cualquier dato estático que tenga, porque reutiliza el proceso, por lo que necesita restablecer manualmente cualquier cosa que no sea válida en una nueva ejecución (como cualquier textura OpenGL o objetos de búfer de vértice). Te da un nuevo hilo de Java y una nueva aplicación de Java y otros objetos también, así que cualquier referencia global en caché a los objetos que serían nuevos en una nueva instancia de tu aplicación necesita ser borrada también.
Así que la estrategia que uso es doble: Minimizar reinicia, y nuke todo al reiniciar.
Se minimizan las reinicio manipulando los configChanges en la aplicación, como se dice en la respuesta a la pregunta que se vinculó. A continuación, la apertura de un teclado o la rotación no causan un reinicio de la aplicación, que es como debería ser para cualquier aplicación con tiempos de inicio no triviales.
Y cuando detecto que se ha iniciado una nueva instancia de mi aplicación, libero todo lo crítico de la antigua instancia en ese momento, incluyendo la liberación de los objetos Java a los que me sujeta a través de NewGlobalRef. Traté de minimizar los datos estáticos, pero los pocos lugares inevitables donde me mantienen alrededor de los objetos estáticos los borro cuando detecto la nueva instancia de arranque.
Los antiguos hilos deben desaparecer una vez que no haya más referencias sobresalientes a ellos (es decir, una vez que haya liberado todos sus objetos NewGlobalRef).
Si se reinicia la VM, se inicia desde cero. Si no, el estado está justo donde lo dejó. No hay invalidación de las referencias de objetos en caché que arrancan las cosas de bajo NewGlobalRef. Escribí algunas otras notas sobre el artículo wooyd en la lista de correo de NDK .
Si tiene datos que deben inicializarse cuando se reinicie su actividad, debería agregar una llamada de inicialización explícita a su actividad (en onCreate, creo). Asegúrese de descartar correctamente cualquier material que conservó de la ronda anterior – DeleteLocalRef y luego almacenar NULL, no sólo memset () a cero.
- Hacer vista sesgada en android
- Administrador de descargas de archivos múltiples en listview + progreso / pausa / reanudar android