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

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?

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.

  • Cómo abrir mi aplicación Android nativa desde una entrada en Facebook
  • Manera más fácil de depurar accidente en la biblioteca nativa, vinculado por la aplicación de Android?
  • Passprops equivalente para Navigator?
  • ¿Cómo lograr algo como CoordinatorLayout en React Native?
  • Android Native debug (ndk-gdb) en HTC Desire: run-as defecto?
  • Acelerómetro (acceso rápido) mediante NativeActivity NDK
  • Memoria insuficiente al asignar memoria nativa
  • Eclipse no puede resolver el código nativo de android
  • Cómo utilizar OpenSSL Library en la aplicación ANDROID
  • Android JNI nativo C función llamada mata actividad
  • React-Native ListView renderRow emite pases de paso. El camino correcto o el camino equivocado
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.