引起:java.lang.UnsatisfiedLinkError:无法加载库

Shr*_*hri 8 android

我正在写一个游戏,我有一个庞大的本机库,我试图在我的主要活动中加载我的本机库

 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:无法加载库 ".注意:此崩溃不是通用的,只有少数人正在崩溃

  • 将库放入导出的apk中是否有问题?我现在通过eclipse自动将库放入/libs/armabi/libmylib.so?
  • 这与Android的版本有关吗?自2.3以来我支持Android版本(API级别9)
  • 或者我需要从不同的地方加载库?
  • 或者我错过了一些非常重要的事情
  • 整个应用程序安装在SDCARD上有问题吗?

有关崩溃的更多信息是: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的段).

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

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

  2. 创建两个单独的apk文件 - 一个用于ARM6,一个用于ARM7 - 然后使用清单中的过滤器指定相应的体系结构.您可以将它们上传到同一个应用程序的Google Play中 - 并且清单中的过滤器将控制将哪个过滤器下载到哪个设备.

  3. 仅通过在清单中指定设备要求来支持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子目录中的文件文件中找到有关体系结构定位的所有信息.