android c++ swig android-library

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



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