【问题标题】:Android multidex, UnsatisfiedLinkError - couldn't find .so fileAndroid multidex,UnsatisfiedLinkError - 找不到 .so 文件
【发布时间】:2016-03-04 08:25:12
【问题描述】:

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

当我只向项目中添加几个 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"

知道如何告诉编译器在同一个 dex 中生成 jar 等吗?

【问题讨论】:

  • 不,.so 不会进入 dex。但请检查 .so 是否已打包到您的 APK 中。您可以使用unzip -l 列出 APK 文件的内容。
  • 是的,它已打包在我的 APK 中。
  • 您的 APK 在停止工作时的总大小是多少?这是什么设备?
  • 更新:如果我将 .so 文件添加到 jniLibs 中的其他 3 个文件夹中,它会起作用。现在我在项目的 4 个文件夹中有 .so 文件(armeabi、mips、armeabi-v7 和 x86)。 .so 的大小是 14MB,4 倍是很多。
  • 所以可能根本原因不是 multidex 而不是大小,但也许其中一个额外的 JAR 为 armeabi-v7a 带来了本机库,而您的 libScanovatePassportAndIDLSDK_CPP .so 只为 armeabi 构建。然后解决方法不是添加更多 .so 的副本,而是剥离其他 ABI。在gradle中,你可以use splits

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


【解决方案1】:

对此有一个优雅的解决方案。当您的 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"
【解决方案2】:

如果一些额外的 JAR 为 armeabi-v7a 带来了本机库,而您的 libScanovatePassportAndIDLSDK_CPP.so 只是为 armeabi 构建的,那么安装程序将提取一组错误的库。解决方法不是添加更多 .so 副本,而是剥离其他 ABI。在 gradle 中,你可以使用splits

【讨论】:

  • 谢谢!我已经用尽了所有基本的 UnsatisfiedLinkError 问题;终于找到了。
猜你喜欢
  • 1970-01-01
  • 2016-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-20
  • 1970-01-01
  • 1970-01-01
  • 2013-09-04
相关资源
最近更新 更多