android - java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader
c++ swig (16)
-si
gradle.properties
no está disponible, primero agregue ese archivo y agregue
android.useDeprecatedNdk=true
-utiliza este código en build.gradle
defaultConfig {
applicationId ''com.example.application''
minSdkVersion 16
targetSdkVersion 21
versionCode 11
versionName "1.1"
ndk {
abiFilters "armeabi"
}
}
``
¿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 la clase ''ejemplo'' existe en la carpeta actual.
Actualmente estoy trabajando en una aplicación de Android que transmite radio. Yo uso la biblioteca de decodificadores nativos que se llama aacdecoder. Todo estuvo bien hasta que la aplicación recibió un error de bloqueo en algunos dispositivos Android. Fue realmente molesto. Debido a que la aplicación reproducía perfectamente transmisiones de radio en casi todos los dispositivos, excepto Samsung S6 y S6 Edge.
Informe de bloqueo 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 bloqueo indica que no se pudo cargar la biblioteca nativa. ¿Pero por qué? En primer lugar, verifiqué mi estructura, si la biblioteca nativa .so archivos ubicados correctamente.
Parece que todo estuvo bien excepto este loco error. Luego, después de investigar un poco, descubro que algunos de los dispositivos Android tienen procesadores de 64 bits. Este dispositivo genera y verifica 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. Entonces, cuando su dispositivo intente ejecutar su aplicación, verificará el archivo gradle y comprende que no debe generar ninguna carpeta y usar los recursos de la biblioteca nativa existente. Boom, casi resuelto. Pero aún hay una cosa más.
android.useDeprecatedNdk=true
Agregue esta línea a su 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 compilación de alguna manera, copiando manualmente estos archivos en la carpeta de compilación como se muestra a continuación puede resolver el problema:
build/intermediates/rs/{build config}/{support architecture}/
configuración de compilación: beta / producción / sit / uat
arquitectura de soporte: armeabi / armeabi-v7a / mips / x86
En este artículo se describe otra causa de bloqueo y una posible solución: 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("<your_libs_name>");
} catch (UnsatisfiedLinkError e) {
ReLinker.loadLibrary(context, "<your_libs_name>");
}
}
Esto me ayudo. Compartiéndolo con alguien que pueda tener el mismo problema.
android {
....
defaultConfig {
....
ndk {
abiFilters "armeabi", "armeabi-v7a", "x86", "mips"
}
}
}
Esto me funcionó
Si tiene un archivo .so en armeabi, mencione dentro de ndk esa carpeta solo.
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
Esto podría ser un problema relacionado con el dispositivo.
Recibía 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"
}
}
}
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 proyecto -> aplicación -> src -> principal -> jniLibs
Tenía todas las bibliotecas con los nombres correctos y cada una colocada en su respectiva subcarpeta de arquitectura, pero aún tenía la misma excepción; incluso probé muchas otras respuestas SO como la respuesta aceptada aquí, compilando un JAR con .so libs, colocando 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
Lo que me ayudó fue registrar el directorio fuente de los archivos jni en el archivo build.gradle. Agregue esto a su archivo gradle:
android {
sourceSets {
main {
jniLibs.srcDir ''[YOUR_JNI_DIR]'' // i.e. ''libs''
}
}
}
Para mí, el problema era que NDK_ROOT no estaba configurado.
Verifique su consola si:
NDK_ROOT = Ninguno [!] NDK_ROOT no está definido. Defina NDK_ROOT en su entorno o en local.properties
Compruebe si ha configurado:
- NDK_ROOT y SDK_ROOT en C / C ++ -> Build-> Environment
- Android-> NDK
- Android-> SDK
Si está utilizando Android Studio, 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 como se muestra a continuación:
android {
....
defaultConfig {
....
ndk {
abiFilters "armeabi", "armeabi-v7a", "x86", "mips"
}
}
}
Si usa un módulo con código c ++ y tiene el mismo problema, puede intentar
Build -> Refresh Linked C++ Projects
Además, debe abrir algún archivo de este módulo y hacer
Build -> Make module "YourNativeLibModuleName"
Tenga en cuenta que hay una convención de nomenclatura. Su lib debe llamarse libexample.so.
LoadLibrary ("ejemplo") buscará libexample.so.
La biblioteca .so debe estar dentro del apk debajo de la carpeta lib (dado que está desarrollando para Android, debe estar debajo de las carpetas lib / armeabi y lib / armeabi-v7a, ¿por qué ambas carpetas? Algunas versiones de Android se ven debajo de lib / armeabi y algunos miran bajo lib / armeabi-v7a ... se lo que funciona para usted).
Otras cosas a buscar:
-
asegúrese de compilar para la arquitectura correcta (si compila 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. Las funciones expuestas deben parecerse a Java_mypackagename_myjavabridgeclass_myfunction).
Por ejemplo, la función Java_com_example_sample_hello se traducirá en la clase java com.example.sample, función hello.
Yo uso Android Studio 3.0 y encuentro este problema. Y estoy seguro de que la aplicación build.gradle está bien.
Vaya a Ejecutar -> Editar configuraciones -> Perfiles y desactive "Activar perfiles avanzados".
Esto funciona para mi. Respuesta de referencia
System.loadLibrary
carga una biblioteca compartida desde la carpeta
lib
.
¿Qué quiere decir cuando dice "Estoy seguro de que la clase ''ejemplo'' existe en la carpeta actual"?
Debería poner su biblioteca .so en la carpeta
lib
.
Simple Solution with Pics
Step1: Add following code in build.gradle file under defaultConfig
ndk {
abiFilters "armeabi-v7a", "x86", "armeabi", "mips"
}
Example:[![enter image description here][1]][1]
Steo 2: Add following code in gradle.properties file
android.useDeprecatedNdk=true
Example: [![enter image description here][2]][2]
Step 3: Sync Gradle and Run the Project.
@Ambilpur
[1]: https://i.stack.imgur.com/IPw4y.png
[2]: https://i.stack.imgur.com/ByMoh.png