Android multidex,UnsatisfiedLinkError-找不到.so文件

9

我正在尝试在Android Studio中为我的multidex项目添加一些库(.jar和.so)。

当我仅向项目添加几个jar文件时,一切正常。但如果我添加了更多的jar文件(其他库),我会遇到以下错误:

java.lang.UnsatisfiedLinkError:
  dalvik.system.PathClassLoader[DexPathList[[zip file
  "/data/app/com.test.digital.ocrtest-2/base.apk"],nativeLibraryDirectories=[/data/app/com.test.digital.ocrtest-2/lib/arm,
  /data/app/com.test.digital.ocrtest-2/base.apk!/lib/armeabi-v7a,
  /vendor/lib, /system/lib]]] couldn't find
  "libScanovatePassportAndIDLSDK_CPP.so"

有什么办法可以告诉编译器同时生成jar和dex文件吗?

不,.so 文件不会被编译成 dex。但是请检查 .so 文件是否已经打包到你的 APK 中。你可以使用 unzip -l 命令列出 APK 文件的内容。 - Alex Cohn
是的,它被打包在我的 APK 中。 - Nimrod Borochov
更新:如果我将.so文件添加到jniLibs中的其他3个文件夹中,它就可以工作。 现在我的项目中有4个文件夹(armeabi、mips、armeabi-v7和x86)中都有.so文件。 .so文件的大小为14MB,4次是很多的。 - Nimrod Borochov
1
因此,根本原因可能不是multidex和大小,而是其中一个额外的JAR为armeabi-v7a带来了本地库,而您的libScanovatePassportAndIDLSDK_CPP.so仅构建为armeabi。修复方法不是添加更多的**.so**副本,而是剥离其他ABIs。在gradle中,您可以使用splits - Alex Cohn
我会尝试的。谢谢您。 - Nimrod Borochov
显示剩余2条评论
2个回答

7
如果一些额外的JAR包带有armeabi-v7a本地库,而您的libScanovatePassportAndIDLSDK_CPP.so只是为armeabi构建的,则安装程序将提取错误的库集。解决方法不是添加更多的.so副本,而是去除其他ABIs。在gradle中,您可以使用splits

2
谢谢!我已经尝试了所有基本的UnsatisfiedLinkError问题,终于找到了这个。 - Jack O'Reilly

2
有一个优雅的解决方案。当您的APK文件不包含某个ABI的所有本地库的64位版本时,您只需要确保您的APK文件不包含任何64位库即可。以下是如何配置项目以修复此问题的教程:https://corbt.com/posts/2015/09/18/mixing-32-and-64bit-dependencies-in-android.html 背景 当您的应用程序安装在64位ABI设备上时,软件包管理器会在安装时扫描APK文件并查找64位本地库。如果它找到适当的64位本地库文件夹(如果使用任何zip客户端打开APK文件,则可以检查/libs文件夹),则它会假定所有本地库都有64位版本可用。如果一个或多个本地库没有64位版本,则软件包管理器将无法加载它们的32位版本。因此,当应用程序尝试运行依赖于这些本地库的代码时,您将收到此UnsatisfiedLinkError消息。这意味着您的库的32位版本不存在。

虽然这个问题是我的问题,但不要认为它适用于 OP。对我来说,死结的关键在于错误显示系统仅查找了 64 个目录 java.lang.UnsatisfiedLinkError: ...nativeLibraryDirectories=[/data/app/com.example.debug-1/lib/arm64, /system/lib64, /vendor/lib64]]] couldn't find "mylib_jni.so" - tir38

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接