我正在写一个游戏,我有一个庞大的本地库,我正在尝试在我的主要活动中加载我的本机库,如
static {
try {
System.loadLibrary("mylib");
} catch (UnsatisfiedLinkError e) {
Log.d(TAG, "Unsatisfied Link error: " + e.toString());
}
}
我已在内部的许多设备上测试过此代码,我没有收到此错误。但是从我发布的文章中我得到的日志包含“引起:java.lang.UnsatisfiedLinkError:无法加载库”。注意:此崩溃不是通用的,只有少数人正在崩溃
关于崩溃的更多信息是:load_segments:68无法从mylib.so映射片段
答案 0 :(得分:14)
考虑到您的应用程序在大多数设备上都能正常工作,并且有时只会给您带来错误,因此可以安全地假设该库在APK中正确打包,并且其大小/内存占用也是可接受的。
因此,我会突发奇想,并建议问题在于库的构建/编译体系结构。大多数较新的Android设备都使用ARM7处理器。您的库很可能也是针对ARM7架构编译的。一些旧设备,特别是那些运行Android 2.3的设备,使用ARM6处理器(我有一个这样的设备用于测试 - 运行Android 2.3.3的LG GT540),它与ARM7架构不兼容。当我试图在我的旧ARM6手机上运行为ARM7设计的应用程序时,我看到了一个类似于您指示的错误( load_segments:68无法映射来自mylib.so 的段)的错误。< / p>
有三种方法可以解决这个问题:
针对两种体系结构编译库,并在apk中包含两个单独的.so文件。然后在运行时确定处理器的类型并加载正确的处理器。坦率地说,我不知道这是否可能。
创建两个单独的apk文件 - 一个用于ARM6,一个用于ARM7 - 然后使用清单中的过滤器指定相应的体系结构。你可以将它们上传到同一个应用程序的谷歌播放 - 清单中的过滤器将控制哪个过滤器下载到哪个设备。
仅通过在清单中指定设备要求来支持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的CPU-ARCH-ABIS.html
子目录中的文件docs
文件中找到有关体系结构定位的所有信息。