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.
- Pasar descriptor de archivo USB al programa Android NDK
- Pasar el puntero de C a Java se convierte en NULL
- ByteBuffer no libera memoria
- CheckJNI de Android: ¿Cómo apagarlo / encender (en un emulador)? La documentación parece estar defectuosa
- Android MediaRecorder para grabar una superficie (no la cámara)
- Creación de un android.graphics.Bitmap desde C ++
- Uso de javah en linux
- Activos de Android, C, JNI
- Env-> FindClass función devuelve null
- Cómo utilizar c / cpp biblioteca / funciones en android
- La aplicación se bloquea al cambiar de actividad de cocos2d-x a otra actividad en Android
- JNI: Llamar a GetStaticMethodID explotar
- OpenCV en Android - Encabezados; No hay tal directorio de archivos
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á.
- Aplicación de Android: permiso de SocketException denegado (ningún archivo o directorio de este tipo)
- Android Marshmallow 6.0.1 Análisis Bluetooth Devuelto Sin Resultados