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

时间:2015-11-30 16:15:46

标签: android android-studio java-native-interface android-gradle

我正在尝试在android studio中为我的multidex项目添加一些lib(.jar& .so)。

当我只为项目添加几个罐子时,一切正常。 如果我添加越来越多的罐子(其他库) 我收到了这个错误:

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"

任何想法如何告诉编译器在同一个dex中生成jar?

2 个答案:

答案 0 :(得分:6)

如果某些额外的JAR为 armeabi-v7a 带来原生图片,而 libScanovatePassportAndIDLSDK_CPP.so 仅为 armeabi 构建,则安装程序将提取一组错误的库。修复不是添加更多 .so 的副本,而是剥离其他ABI。在gradle中,您可以使用splits

答案 1 :(得分:1)

这是一个优雅的解决方案。如果您的APK文件没有包含64位版本的特定ABI的所有本机库,您只需要确保您的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位版本

相关问题