我正在写一个游戏,我有一个庞大的本机库,我试图在我的主要活动中加载我的本机库
static {
try {
System.loadLibrary("mylib");
} catch (UnsatisfiedLinkError e) {
Log.d(TAG, "Unsatisfied Link error: " + e.toString());
}
}
Run Code Online (Sandbox Code Playgroud)
我已在内部的许多设备上测试了此代码,我没有收到此错误.但是从我发布的我得到的日志有" 引起:java.lang.UnsatisfiedLinkError:无法加载库 ".注意:此崩溃不是通用的,只有少数人正在崩溃
有关崩溃的更多信息是:load_segments:68无法映射mylib.so中的段
Ale*_*s G 14
考虑到您的应用程序在大多数设备上正常工作,并且有时只会给您错误,可以安全地假设该库在APK中正确打包并且其大小/内存占用也是可接受的.
因此,我会突发奇想,并建议问题在于库的构建/编译体系结构.大多数较新的Android设备都使用ARM7处理器.您的库很可能也是针对ARM7架构编译的.一些旧设备,特别是那些运行Android 2.3的设备,使用ARM6处理器(我有一个这样的设备用于测试 - 运行Android 2.3.3的LG GT540),这与ARM7架构不兼容.当我试图在我的旧ARM6手机上运行为ARM7设计的应用程序时,我看到了一个类似于您指示的错误的崩溃(load_segments:68无法映射来自mylib.so的段).
有三种方法可以解决这个问题:
针对两种体系结构编译库,并在apk中包含两个单独的.so文件.然后在运行时确定处理器的类型并加载正确的处理器.坦率地说,我不知道这是否可行.
创建两个单独的apk文件 - 一个用于ARM6,一个用于ARM7 - 然后使用清单中的过滤器指定相应的体系结构.您可以将它们上传到同一个应用程序的Google Play中 - 并且清单中的过滤器将控制将哪个过滤器下载到哪个设备.
仅通过在清单中指定设备要求来支持ARM7体系结构.您将失去一些客户受众,但维护应用程序的两个版本的工作量会减少.
编辑:根据NDK文档,它可以一次为不同的架构生成多个库.您可以通过在Application.mk文件中添加以下行来具体控制要定位的CPU :
APP_ABI := arch1 arch2 arch3 ...
Run Code Online (Sandbox Code Playgroud)
例如,
APP_ABI := armeabi armeabi-v7a mips
Run Code Online (Sandbox Code Playgroud)
然后,构建过程将创建本机库的不同版本.这些版本需要放在最终的apk目录中
lib/<abi>/lib<name>.so
Run Code Online (Sandbox Code Playgroud)
这是架构的名称.然后,您将加载库
System.loadLibrary("<name>");
Run Code Online (Sandbox Code Playgroud)
或者,您可以为每个体系结构构建单独的apk文件,然后在Google Play上使用多apk功能.
您可以在NDK CPU-ARCH-ABIS.html的docs子目录中的文件文件中找到有关体系结构定位的所有信息.
| 归档时间: |
|
| 查看次数: |
15366 次 |
| 最近记录: |