【问题标题】:Some customers get a java.lang.UnsatisfiedLinkError when upgrading my Android app. How do I fix this?一些客户在升级我的 Android 应用程序时收到 java.lang.UnsatisfiedLinkError。我该如何解决?
【发布时间】:2026-02-19 14:55:01
【问题描述】:

每次我更新我的 Android 应用时,都会有几个随机客户收到此异常。我将其缩小到两个原因,都与使用 jni 有关。

  1. 升级应用时会删除 *.so 库。
  2. 应用升级时*.so库没有升级,老版本依然存在。

设备报告并未表明此问题与操作系统版本、内存或任何合理因素有关。与其关注为什么 Android 在升级库时遇到问题,我希望有人知道如何在遇到此错误时手动将库从应用程序的 APK 中拉出并放在正确的目录中。

【问题讨论】:

    标签: java android installation java-native-interface


    【解决方案1】:

    似乎您可能有 ABI 不匹配 - 或者可能是由人们一直在谈论的 Android 错误引起的 false ABI 不匹配,其中一个通用臂库可能不被接受专业品种优先。

    至于您的解决方法...您无法写入应用程序安装的 lib/ 目录,但如果您使用 System.load() 和精确的路径/文件名而不是 loadLibrary() ,则可以将库放在其他位置只是一个库名。我认为没有任何官方(如未来证明)方法可以从您的 apk 中提取任意内容,尽管目前使用 zipfile 类(可能使用诸如 Context.getPackageCodePath() 之类的东西来发现apk 的位置和安装变量名称)

    检查库加载尝试是否成功并在失败时报告有关设备的信息可能同样有用。

    【讨论】:

    • 以下似乎是 Chris 所指的问题。 code.google.com/p/android/issues/detail?id=25321
    • 经过一些研究,我可以确认这只发生在 ARMv7 设备上(还没有英特尔数据),即使我的应用程序支持通用 ARM。这发生在 Android 2.3、3.0 和 4.0.1、2、3、4 上。它应该在 Android 4.0.4r1.1 中修复。解决方法很简单,告诉客户升级到4.0.4r1.1或更高版本即可。以下似乎是克里斯所指的问题。 code.google.com/p/android/issues/detail?id=25321 开个玩笑。解决方案是检测此故障并通知客户他们必须卸载、重新安装并希望获得最好的结果。