gpt4 book ai didi

android - Caused by : java. lang.UnsatisfiedLinkError: 无法加载库

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:58:49 24 4
gpt4 key购买 nike

我正在写一个游戏,我有一个巨大的本地库,我正试图在我的主要 Activity 中加载我的本地库

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

我已经在内部的许多设备上测试了这段代码,我没有收到这个错误。但是从我发布的文章中,我确实得到了带有“由:java.lang.UnsatisfiedLinkError:无法加载库”引起的日志。注意:这种崩溃并不普遍,只有少数人遇到这种崩溃

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

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

最佳答案

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

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

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

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

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

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

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

APP_ABI := arch1 arch2 arch3 ...

例如,

APP_ABI := armeabi armeabi-v7a mips

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

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

体系结构的名称在哪里。然后你将加载库

System.loadLibrary("<name>");

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

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

关于android - Caused by : java. lang.UnsatisfiedLinkError: 无法加载库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16519262/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com