Causado por: java.lang.UnsatisfiedLinkError: No se puede cargar la biblioteca

Estoy escribiendo un juego, y tengo la biblioteca nativa enorme, estoy intentando cargar mi biblioteca nativa en mi actividad principal como

static { try { System.loadLibrary("mylib"); } catch (UnsatisfiedLinkError e) { Log.d(TAG, "Unsatisfied Link error: " + e.toString()); } } 

He probado este código en muchos dispositivos en casa, no consigo este error. Pero desde mi publicado hago obtener registros con " Causado por: java.lang.UnsatisfiedLinkError: No se puede cargar la biblioteca ". NOTA: Este bloqueo no es universal, sólo pocas personas están recibiendo este bloqueo

  • ¿Es un problema donde se pone la biblioteca en apk exportado? Ahora tengo la biblioteca puesta en /libs/armabi/libmylib.so automáticamente por eclipse?
  • ¿Es algo que ver con la versión de android? Estoy soportando versiones de android desde 2.3 (API nivel 9)
  • O tengo que cargar la biblioteca de un lugar diferente?
  • O estoy perdiendo algo muy importante
  • ¿Es un problema con la aplicación completa que se está instalando en SDCARD?

Más información sobre la falla es: load_segments: 68 falló al mapear segmento de mylib.so

Teniendo en cuenta que la aplicación funciona correctamente en la mayoría de los dispositivos y sólo a veces te da el error, es seguro asumir que la biblioteca se empaqueta correctamente en el APK y que su tamaño / huella de memoria también es aceptable.

Como tal, iré en el capricho y sugiero que el problema está con la estructura / compila la arquitectura de la biblioteca. La mayoría de los dispositivos Android más recientes utilizan el procesador ARM7. Es muy probable que su biblioteca se compile contra la arquitectura ARM7 también. Algunos dispositivos más antiguos, especialmente los que ejecutan Android 2.3, utilizan el procesador ARM6 (tengo un dispositivo que utilizo para las pruebas – LG GT540 con Android 2.3.3), que no es compatible con ARM7. He visto un bloqueo con un error similar al que indicó ( load_segments: 68 no mapeó el segmento de mylib.so ) cuando intenté ejecutar una aplicación diseñada para ARM7 en mi antiguo teléfono ARM6.

Existen tres maneras de resolver este problema:

  1. Compile la biblioteca contra ambas arquitecturas e incluya dos archivos separados .so en el apk. A continuación, en tiempo de ejecución, determine el tipo de procesador y cargue el correcto. Francamente, no sé si esto es posible.

  2. Cree dos archivos apk separados – uno para ARM6 y otro para ARM7 – luego use filtros en el manifiesto para especificar la arquitectura correspondiente. Puedes subir los dos a google play para la misma aplicación – y los filtros en el manifiesto controlarán el que se descarga en qué dispositivo.

  3. Sólo admita la arquitectura ARM7 especificando los requisitos del dispositivo en el manifiesto. Usted perderá un poco la audiencia del cliente, pero tendrá menos trabajo para usted que mantiene las dos versiones de la aplicación.

EDIT: Según la documentación de NDK, puede producir múltiples bibliotecas para diferentes arquitecturas de una sola vez. Puede controlar específicamente qué CPU desea segmentar agregando la siguiente línea al archivo Application.mk :

 APP_ABI := arch1 arch2 arch3 ... 

por ejemplo,

 APP_ABI := armeabi armeabi-v7a mips 

A continuación, el proceso de creación creará diferentes versiones de la biblioteca nativa. Estas versiones tendrán que ser colocadas en el apk final en el directorio

 lib/<abi>/lib<name>.so 

Donde está el nombre de la arquitectura. A continuación, cargará la biblioteca con

 System.loadLibrary("<name>"); 

Como alternativa, puede crear archivos apk independientes para cada arquitectura y utilizar la funcionalidad multi-apk en google play.

Puede encontrar toda la información sobre la orientación de arquitectura en el archivo CPU-ARCH-ABIS.html en el subdirectorio docs del NDK.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.