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

时间:2013-05-13 09:55:17

标签: android

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

 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吗?
  • 与android的版本有关吗?我从2.3(API级别9)
  • 支持Android版本
  • 或者我是否需要从不同的地方加载库?
  • 或者我错过了一些非常重要的内容
  • 整个应用程序安装在SDCARD上是否有问题?

关于崩溃的更多信息是:load_segments:68无法从mylib.so映射片段

1 个答案:

答案 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>

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

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

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

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

  4. 编辑:根据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文件中找到有关体系结构定位的所有信息。