【问题标题】:Caused by: java.lang.UnsatisfiedLinkError: Cannot load library引起:java.lang.UnsatisfiedLinkError:无法加载库
【发布时间】:2013-12-16 17:37:27
【问题描述】:

我正在编写一个游戏,并且我有庞大的本地库,我正在尝试将我的本地库加载到我的主要活动中,例如

 static {
        try {
            System.loadLibrary("mylib");
        } catch (UnsatisfiedLinkError e) {
            Log.d(TAG, "Unsatisfied Link error: " + e.toString());
        }
    }

我已经在内部的许多设备上测试了此代码,但我没有收到此错误。但从我发表的文章中,我确实得到了带有“Caused by: java.lang.UnsatisfiedLinkError: Cannot load library”的日志。注意:这种崩溃不是普遍的,只有少数人会遇到这种崩溃

  • 库放在导出的 apk 中是否有问题?我现在已经通过 Eclipse 自动将库放入 /libs/armabi/libmylib.so 中?
  • 是不是跟安卓版本有关系?我从 2.3(API 级别 9)开始支持 android 版本
  • 还是我需要从不同的地方加载库?
  • 或者我错过了一些非常重要的东西
  • 整个应用安装在 SDCARD 上是否有问题?

有关崩溃的更多信息是:load_segments: 68 failed to map segment from mylib.so

【问题讨论】:

  • 我有庞大的原生库,有多大?可能是不满足某些内存要求,系统无法加载。
  • ~ 7MB(调试版)
  • 这绝对不是内存问题。您在什么设备上解决了这个问题?
  • 你编译它的处理器架构是什么?大多数较新的设备使用 ARM7 处理器,而一些较旧的设备使用 ARM6。如果您针对 ARM7 编译本机库,它可能无法在 ARM6 上加载。
  • @blackbelt:有问题的设备是 Desire HD,这是来自 google play 评论。不过,我无法用我的 HTC 愿望重现此问题。

标签: android


【解决方案1】:

考虑到您的应用在大多数设备上都能正常运行,并且只是有时会出现错误,因此可以安全地假设该库已正确打包在 APK 中,并且其大小/内存占用也是可以接受的。

因此,我会随心所欲地提出问题出在库的构建/编译体系结构上。大多数较新的 Android 设备使用 ARM7 处理器。您的库很可能也是针对 ARM7 架构编译的。一些较旧的设备,尤其是那些运行 Android 2.3 的设备,使用 ARM6 处理器(我有一个用于测试的此类设备 - 运行 Android 2.3.3 的 LG GT540),它与 ARM7 架构不兼容。当我尝试在我的旧 ARM6 手机上运行专为 ARM7 设计的应用程序时,我看到了与您指出的错误类似的崩溃(load_segments: 68 failed to map segment from mylib.so)。

解决这个问题的三种方法:

  1. 针对两种架构编译库,并将两个单独的 .so 文件包含到 apk 中。然后在运行时确定处理器的类型并加载正确的处理器。坦率地说,我什至不知道这是否可能。

  2. 创建两个单独的 apk 文件——一个用于 ARM6,一个用于 ARM7——然后在清单中使用过滤器来指定相应的架构。您可以将它们都上传到同一应用的 google play - 清单中的过滤器将控制哪个下载到哪个设备。

  3. 仅通过在清单中指定设备要求来支持 ARM7 架构。您将失去一些客户受众,但您自己维护应用程序的两个版本的工作量会减少。

编辑: 根据 NDK 文档,它可以一次性为不同架构生成多个库。您可以通过在Application.mk 文件中添加以下行来具体控制要定位的 CPU:

APP_ABI := arch1 arch2 arch3 ...

例如,

APP_ABI := armeabi armeabi-v7a mips

然后构建过程会创建不同版本的原生库。这些版本需要放在最终的apk目录中

lib/<abi>/lib<name>.so

架构的名称在哪里。然后,您将加载库

System.loadLibrary("<name>");

或者,您可以为每个架构构建单独的 apk 文件,然后在 google play 上使用多 apk 功能。

您可以在 NDK 的 docs 子目录中的文件 CPU-ARCH-ABIS.html 文件中找到有关架构目标的所有信息。

【讨论】:

  • 我接受你的回答,我认为你的建议是合乎逻辑的。但是我不确定清单中是否有选项或我可以专门为 amrv6 和 armv7 构建的任何地方,我找不到通过 android manifest 解决此问题的方法
  • @techjeevi 架构未在 apk 清单中指定,但在本机库的构建文件中指定。它后来被合并到构建应用程序中并被 google play 使用。我会做一些挖掘来找到一个例子。
  • @techjeevi 我更新了我的答案,详细说明了如何使用不同版本的本地库来定位不同的架构,以及在哪里可以找到更多信息。
  • @techjeevi 我并不是说它是解决方案或它会起作用,只是描述一种可能的情况。您可能还想查看您可能正在使用的处理器的特定功能。两种不同的 ARM7 芯片可能支持不同的功能集 - 如果您的本机库尝试使用不受支持的功能,它可能会失败。同一 NDK 文档目录中的 CPU-FEATURES.HTML 文件描述了如何在运行时测试特定功能的可用性。根据 NDK 文档,hello-neon NDK 示例说明了特定功能的运行时检查。只是一个想法。
  • 绝对帮助了我。当我从java加载它时省略了“lib”前缀。完全没有意义。谢谢!
猜你喜欢
  • 1970-01-01
  • 2013-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多