如何在 64 位 Android 设备上使用 32 位本机库
How to use 32-bit native libraries on 64-bit Android device
我在我的应用程序中使用了一个仅为 armeabi、armeabi-v7a 和 x86 编译的本机库。
当这个库加载到像三星 S6 这样的 64 位设备上时,应用程序崩溃并出现 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)
不幸的是,该库是封闭源代码的。有什么方法可以解决此问题而无需使用 64 位目标重新编译库?
当您在 Android 上安装 APK 时,系统将在lib
APK 文件夹,顺序由 Build.SUPPORTED_ABIS
决定。
如果您的应用碰巧有一个缺少库的 arm64-v8a
目录,则不会从另一个目录安装缺少的库,库不会混合。这意味着您必须为每种架构提供全套库。
因此,要解决您的问题,您可以从构建中删除 64 位库,或将 abiFilters 设置为仅打包 32 位架构:
android {
....
defaultConfig {
....
ndk {
abiFilters "armeabi", "armeabi-v7a", "x86", "mips"
}
}
}
以上答案将有助于生成 32 位版本而非 64 位版本。如果您使用 [ abiFilters "armeabi", "armeabi-v7a", "x86", "mips" ]。 generate signed apk 意味着,这不是 64 位的。当我们上传到 Google Play 商店时,它会引发错误。它不是 64 位版本。
我在我的应用程序中使用了一个仅为 armeabi、armeabi-v7a 和 x86 编译的本机库。
当这个库加载到像三星 S6 这样的 64 位设备上时,应用程序崩溃并出现 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)
不幸的是,该库是封闭源代码的。有什么方法可以解决此问题而无需使用 64 位目标重新编译库?
当您在 Android 上安装 APK 时,系统将在lib
APK 文件夹,顺序由 Build.SUPPORTED_ABIS
决定。
如果您的应用碰巧有一个缺少库的 arm64-v8a
目录,则不会从另一个目录安装缺少的库,库不会混合。这意味着您必须为每种架构提供全套库。
因此,要解决您的问题,您可以从构建中删除 64 位库,或将 abiFilters 设置为仅打包 32 位架构:
android {
....
defaultConfig {
....
ndk {
abiFilters "armeabi", "armeabi-v7a", "x86", "mips"
}
}
}
以上答案将有助于生成 32 位版本而非 64 位版本。如果您使用 [ abiFilters "armeabi", "armeabi-v7a", "x86", "mips" ]。 generate signed apk 意味着,这不是 64 位的。当我们上传到 Google Play 商店时,它会引发错误。它不是 64 位版本。