【问题标题】:Why do I get reports of java.lang.UnsatisfiedLinkError from Market为什么我会从 Market 收到有关 java.lang.UnsatisfiedLinkError 的报告
【发布时间】:2011-12-15 07:50:12
【问题描述】:

我在 Android 市场上有一个应用程序,在它的崩溃报告中我得到了 java.lang.UnsatisfiedLinkError 崩溃,并且每次都是针对不同的 .so 文件。

错误看起来像

java.lang.ExceptionInInitializerError
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.UnsatisfiedLinkError: Couldn't load *****: findLibrary returned null

java.lang.ExceptionInInitializerError
at java.lang.Thread.run(Thread.java:1019)
Caused by: java.lang.UnsatisfiedLinkError: Cannot load library: alloc_mem_region[871]: OOPS: 116 cannot map library ********. no vspace available.

java.lang.UnsatisfiedLinkError: Couldn't load ******: findLibrary returned null
at java.lang.Runtime.loadLibrary(Runtime.java:429)
at java.lang.System.loadLibrary(System.java:554)

看起来有些设备找不到某些 .so 文件。崩溃不是针对任何特定的 .so 文件。我的应用中有大约 4 个 .so 文件,有时它会因 1 个而崩溃,有时会因另一个而崩溃。

虽然我在几乎所有版本的 Android 上进行了测试,但我在测试时永远无法重现此问题...

任何指针将不胜感激

谢谢

【问题讨论】:

  • 认为如果您展示如何链接它会有所帮助
  • 只需 System.loadLibrary("mylibrary")。正如我已经在大多数设备中提到的那样,没有问题..但我仍然从市场上得到一些报告..
  • 我还不能解决这个问题,但有一个补充信息表明将应用程序移动到 sd 卡可以解决某些设备上的问题...我发现的设备主要是 HTC 设备,如 HTC Wildfire S...任何指针?

标签: android crash report google-play unsatisfiedlinkerror


【解决方案1】:

我自己也看到过类似的问题——这似乎影响了极少数用户,我无法直接将其与设备类型或操作系统相关联。然而,根据我所做的研究,我发现了关于Cyanogenmod Google Code page 的讨论;快速总结一下:听起来该 mod 的某些版本没有精确复制 Google 对系统级库所做的一些更改,这意味着某些符号(例如__android_log_print)可能会导致错误,包括导致您的库无法加载.

我正在尝试进一步确定这一点,但我想我会分享我迄今为止所拥有的。

【讨论】:

    【解决方案2】:

    您知道产生此问题的手机和/或 android 版本吗?

    图书馆有多大?也许您在加载库时遇到了旧手机的一些内存限制?

    【讨论】:

    • 这可能是原因之一......正如我所说,我无法在我拥有的任何设备上复制,Android 市场日志没有提供设备信息......
    【解决方案3】:

    也许你在 libxxxx.so 中分配了太多内存

    “原因:java.lang.UnsatisfiedLinkError:无法加载库:alloc_mem_region[871]:OOPS:116 无法映射库**。没有可用的 vspace。”

    【讨论】:

      【解决方案4】:

      尽管我的应用在模拟器中运行良好,并且在我用于测试的少数 Android 设备上运行良好,但我还是从市场收到了有关 UnsatisfiedLinkError 的报告。在某些时候,我打开了生成的 .apk 存档并注意到很少有 libs/<ABI> 文件夹缺少我使用的链接库之一(.so 文件)。事实证明,具有 arm64 功能 CPU 的 Android 设备将加载一些链接库并在找不到我的应用使用的库之一的 arm64 版本时崩溃(而不是回退到 arm7v)。

      此处解释了具有更多详细信息的类似问题: https://realm.io/docs/java/latest/#couldnt-load-librealm-jniso

      长话短说,我在 build.gradle 中添加了额外的配置,不包括 arm64:

      android {
        ndk {
          abiFilters "armeabi", "armeabi-v7a", "x86"
        }
      }
      

      附带说明 - arm64-v8a CPU 与 arm-v7a 指令集兼容,它们可以运行 32 位 Thumb 指令,但不允许混合使用 64 位和 32 位库。

      【讨论】:

        猜你喜欢
        • 2015-08-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多