Cómo usar bibliotecas nativas de 32 bits en dispositivos Android de 64 bits


Uso una biblioteca nativa en mi aplicación que solo está compilada para armeabi, armeabi-v7a y x86.

Cuando esta biblioteca se carga en un dispositivo de 64 bits como el Samsung S6, la aplicación se bloquea con un UnsatisfiedLinkError

java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.myapp-2/base.apk"],nativeLibraryDirectories=[/data/app/com.myapp-2/lib/arm64, /vendor/lib64, /system/lib64]]] couldn't find "libfoo.so"
    at java.lang.Runtime.loadLibrary(Runtime.java:366)
    at java.lang.System.loadLibrary(System.java:989)

Desafortunadamente, la biblioteca es de código cerrado. ¿Hay alguna manera de arreglar esto sin recompilar la biblioteca con objetivos de 64 bits?

Author: Cœur, 2015-06-11

1 answers

Cuando instale un APK en Android, el sistema buscará directorios de bibliotecas nativas (armeabi, armeabi-v7a, arm64-v8a, x86, x86_64, mips64, mips) dentro de la carpeta lib del APK, en el orden determinado por Build.SUPPORTED_ABIS.

Si su aplicación tiene un directorio arm64-v8a con libs faltantes, las libs faltantes no se instalarán desde otro directorio, las libs no se mezclarán. Eso significa que debe proporcionar el conjunto completo de sus bibliotecas para cada arquitectura.

Entonces, para resolver su problema, puede eliminar sus libs de 64 bits de su compilación, o establecer abiFilters para empaquetar solo arquitecturas de 32 bits:

android {
    ....
    defaultConfig {
        ....
        ndk {
            abiFilters "armeabi", "armeabi-v7a", "x86", "mips"
        }
    }
}
 119
Author: ph0b,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-12 09:34:15