java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader

¿Hay alguien que tenga experiencia con este error?

java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/org.swig.simple-2/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]] couldn't find "liborg.swig.simple.example.so" 

Se produce un error cuando cargo la biblioteca de esta manera.

 static { System.loadLibrary("example"); } 

Estoy seguro de que existe una clase ‘de ejemplo’ en la carpeta actual.

Tenga en cuenta que hay una convención de nombres. Su lib necesita ser llamado libexample.so.

LoadLibrary (“example”) buscará libexample.so.

La biblioteca .so necesita estar dentro de la aplicación bajo la carpeta lib (ya que está desarrollando para Android, debe estar bajo las carpetas lib / armeabi y lib / armeabi-v7a – ¿por qué ambas carpetas? Algunas versiones de Android se ven bajo lib / armeabi y algunos miran bajo lib / armeabi-v7a … se lo que funciona para ti).

Otras cosas a tener en cuenta:

  • asegúrese de comstackr para la architecture correcta (si comstack para armeabi v5 no funcionará en armeabiv7 o armeabiv7s).

  • asegúrese de que sus prototipos exportados se usen en la clase correcta (consulte el ejemplo de hello jni. Sus funciones expuestas deben verse como Java_mypackagename_myjavabridgeclass_myfunction).

Por ejemplo, la función Java_com_example_sample_hello se traducirá en la clase java com.example.sample, function hello.

Esto me ayudó. Compartirlo para alguien que pueda surgir con el mismo problema.

 android { .... defaultConfig { .... ndk { abiFilters "armeabi", "armeabi-v7a", "x86", "mips" } } } 

Lo que funcionó para mí fue colocar la carpeta jniLibs debajo de la carpeta “principal”, justo al lado de las carpetas “java” y “res”, por ejemplo project -> app -> src -> main -> jniLibs

Tenía todas las bibliotecas con los nombres correctos y cada una en su respectiva subcarpeta de architecture, pero todavía tenía la misma excepción; incluso intenté muchas otras respuestas de SO como la respuesta aceptada aquí, comstackndo un JAR con .so libs, colocando otra vez la carpeta jniLibs, etc.

Para este proyecto, tuve que usar Gradle 2.2 y Android Plugin 1.1.0 en Android Studio 1.5.1

Uso Android Studio 3.0 y encuentro este problema. Y estoy seguro de que build.gradle de la aplicación está bien.

Vaya a Ejecutar -> Editar configuraciones -> Perfilado, y deshabilite “Activar perfil avanzado”.

Esto funciona para mí Respuesta de referencia

Actualmente estoy trabajando en una aplicación de Android que transmite radio. Yo uso la biblioteca del decodificador nativo que se llama aacdecoder. Todo estuvo bien hasta que la aplicación recibe un error de locking en algunos dispositivos Android. Fue realmente molesto Debido a que la aplicación se reproduce a la perfección las transmisiones de radio casi todos los dispositivos, pero Samsung S6 y S6 Edge.

El informe de Crash dice que

 Fatal Exception: java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file “/data/app/com.radyoland.android-1/base.apk”],nativeLibraryDirectories=[/data/app/com.radyoland.android-1/lib/arm64, /vendor/lib64, /system/lib64]]] couldn't find “libaacdecoder.so” at java.lang.Runtime.loadLibrary(Runtime.java:366) at java.lang.System.loadLibrary(System.java:988) at com.spoledge.aacdecoder.Decoder.loadLibrary(Decoder.java:187) 

Como puede ver, ese locking indica que no pudo cargar la biblioteca nativa. ¿Pero por qué? Antes que nada, verifiqué mi estructura, si los archivos .so de la biblioteca nativa estaban ubicados correctamente.

Parece que todo estuvo bien, excepto este loco error. Luego, después de algunas investigaciones, descubro que algunos dispositivos Android tienen procesadores de 64 bits. Este dispositivo genera y comprueba la carpeta arm64 para cargar la biblioteca nativa. Ese fue el problema. Porque mi proyecto no tiene la carpeta arm64. Aquí está la solución;

 defaultConfig { ... ndk { abiFilters "armeabi-v7a", "x86", "armeabi", "mips" } } 

Debe agregar estos filtros (abiFilters) a los archivos build.gradle de su módulo de aplicación. Por lo tanto, cuando su dispositivo intente ejecutar su aplicación, revisará el archivo gradle y entenderá que no debe generar ninguna carpeta y usar los recursos existentes de la biblioteca nativa. Boom, casi resuelto. Pero aún hay una cosa más.

 android.useDeprecatedNdk=true 

Agregue esta línea a sus gradle.properties para usar Ndk en desuso.

Finalmente mi aplicación funciona en S6 y S6 Edge. Quiero decir que funciona en todos los dispositivos que tienen nuevos procesadores de 64 bits.

Algunas herramientas antiguas de gradle no pueden copiar archivos .so en la carpeta de comstackción de alguna manera, copiar estos archivos manualmente en la carpeta de comstackción como se muestra a continuación puede resolver el problema:

 build/intermediates/rs/{build config}/{support architecture}/ 

configuración de comstackción: beta / production / sit / uat

architecture de soporte: armeabi / armeabi-v7a / mips / x86

Esto me funciona

Si tiene un archivo .so en armeabi, mencione dentro de ndk solo esa carpeta.

 defaultConfig { applicationId "com.xxx.yyy" minSdkVersion 17 targetSdkVersion 26 versionCode 1 versionName "1.0" renderscriptTargetApi 26 renderscriptSupportModeEnabled true ndk { abiFilters "armeabi" } } 

y luego usa esto

 android.useDeprecatedNdk=true; 

en el archivo gradle.properties

-si gradle.properties no está disponible, primero agregue ese archivo y agregue android.useDeprecatedNdk=true

-utilice este código en build.gradle

 defaultConfig { applicationId 'com.example.application' minSdkVersion 16 targetSdkVersion 21 versionCode 11 versionName "1.1" ndk { abiFilters "armeabi" } } 

`

Si usa un módulo con código de C ++ y tiene el mismo problema, podría intentarlo

Build -> Refresh Linked C++ Projects

Además, debe abrir algunos archivos de este módulo y hacer

Build -> Make module "YourNativeLibModuleName"

Lo que me ayudó fue registrar el directorio fuente para los archivos jni en el archivo build.gradle. Agregue esto a su archivo gradle:

 android { sourceSets { main { jniLibs.srcDir '[YOUR_JNI_DIR]' // ie 'libs' } } } 

Si está utilizando un estudio de Android, solo edite gradle.properties en la carpeta raíz y agregue android.useDeprecatedNdk = true. Luego edite el archivo build.gradle en la carpeta de su aplicación, configure abiFilters de la siguiente manera:

 android { .... defaultConfig { .... ndk { abiFilters "armeabi", "armeabi-v7a", "x86", "mips" } } } 

System.loadLibrary carga una biblioteca compartida de la carpeta lib .

¿A qué te refieres cuando dices “Estoy seguro de que la clase ‘de ejemplo’ existe en la carpeta actual”? Debería poner su biblioteca .so en la carpeta lib .

Para mí, el problema era que NDK_ROOT no estaba configurado.

Verifique su consola si:

NDK_ROOT = Ninguno [!] NDK_ROOT no definido. Defina NDK_ROOT en su entorno o en local.properties

Verifica si has configurado:

  • NDK_ROOT y SDK_ROOT en C / C ++ -> Build-> Environment
  • Android-> NDK
  • Android-> SDK

Esto podría ser un problema relacionado con el dispositivo.
Estaba obteniendo este error solo en dispositivos MI , el código funcionaba con todos los demás dispositivos.

Esto podría ayudar:

  defaultConfig{ ... externalNativeBuild { cmake { cppFlags "-frtti -fexceptions" } } } 

Otra causa de locking y posible solución se describe en este artículo: https://medium.com/keepsafe-engineering/the-perils-of-loading-native-libraries-on-android-befa49dce2db

Brevemente:
en build.gradle

 dependencies { implementation 'com.getkeepsafe.relinker:relinker:1.2.3' } 

en codigo

 static { try { System.loadLibrary(""); } catch (UnsatisfiedLinkError e) { ReLinker.loadLibrary(context, ""); } }