Llamar a System.loadLibrary dos veces para la misma biblioteca compartida

Tengo la situación cuando dos jar bibliotecas utilizan la misma biblioteca compartida. En cada biblioteca la clase "la interfaz principal" carga el archivo .so con System.loadLibrary . Mi pregunta es: si el usuario decide usar estas dos bibliotecas jar en un proyecto, ¿la segunda llamada a System.loadLibrary para el mismo archivo .so causará alguna excepción? ¿O es "manejado de alguna manera" por el sistema para evitar que las bibliotecas compartidas se carguen dos veces? O tal vez hay un "patrón comúnmente conocido" para manejar estas situaciones?

Las envolturas jni están destinadas a ser usadas en android. Soy el autor de ambas librerías del envoltorio así que contestarle puede asumir el control completo en fuentes de java.

De acuerdo con los apidocs no debería ser un problema: "Si este método se llama más de una vez con el mismo nombre de biblioteca, la segunda y las siguientes llamadas se ignoran."

He encontrado un caso de uso muy estrecho cuando esto será un problema.

Si está ejecutando la aplicación del sistema Android, con android:sharedUserId="android.uid.system" en el manifiesto, ya sea preinstalado en el dispositivo o firmado con el certificado de la plataforma , y está intentando llamar a System.loadLibrary dos veces para cargar La misma biblioteca (ejecutando la misma aplicación dos veces o creando dos aplicaciones de sistema independientes cargando la misma biblioteca), Android reiniciará.

Si se invoca el método JNI de esta biblioteca, si todavía no se ha cargado, no se generará una excepción al ejecutar dentro del proceso android.uid.system , como con la aplicación normal de Android. Reiniciará Android.

Para evitarlo, y averigüe si la biblioteca ya estaba cargada, puede leer el archivo /proc/self/maps y buscar allí el nombre de su biblioteca. ClassLoader y la reflexión no ayudará aquí – que mostrará métodos JNI como accesible incluso cuando la biblioteca no está todavía cargado.

Tenga en cuenta que no se puede hacer if (Runtime.getRuntime().exec("/system/bin/grep <library-name> /proc/self/maps").waitFor() == 0) Cualquier comando externo de SELinux, tendrá que leer el archivo del código Java.

Otra peculiaridad es que la biblioteca debe estar preinstalada en el dispositivo /system/lib . Si agrupa la biblioteca con su aplicación e instala la aplicación en el dispositivo, la biblioteca terminará en /data/app/..../lib , y cuando intentarás cargarlo desde /data partición de /data , así ya lo has adivinado – Android reiniciará.

  • Cómo eliminar soporte nativo de un proyecto de Android en eclipse porque eclipse está mostrando errores en jni?
  • Devolver un int de la función nativa (c ++, jni) bloquea la aplicación
  • Android ffmpeg simple JNI envoltorio
  • Escriba a stdout en JNI Android? Sin <android / log.h>
  • ¿Cuáles son las consecuencias si intentamos conectar un hilo nativo permanentemente a la DVM (JVM)?
  • Android: Xamarin JNI Binding - Herencia de clase abstracta
  • Error de JNI: desbordamiento de tabla de referencia local 512 entradas
  • Cambiar Actividad con JNI Llamar o usar Openfeint provoca App-Crash
  • Android Cómo leer JNI Core Dump FIles
  • Dalvik está buscando el archivo .so con extensión '.0' - ¿por qué?
  • ¿Cómo empaquete los archivos .so en mi archivo .aar?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.