12

2013 年 8 月 7 日更新: 问题现已解决,但错误的原因出乎意料,所有常见的此类错误嫌疑人在开始时都已消除,我学到了一些新东西。请看下面我的回答。


我在这里很绝望。有一个带有本机库的 Android 应用程序,我从中调用一个方法。在我测试的所有系统上都没有问题,并且该程序已在 Google Play 中发布,没有任何故障报告,被成千上万的用户使用。现在,HTC One 手机的新 ROM(Android 版本 4.2.2)显然已经出局。用户声称它是官方版本,从官方渠道升级。当他们尝试启动我的应用程序时,它崩溃了,堆栈跟踪显示:

java.lang.UnsatisfiedLinkError:找不到本机方法...

并且我知道的方法名称在那里,并且在他们安装了 Android 4.1 的同一台设备上运行良好。我在模拟器中的Android 4.2.2下测试(没有这个特定的设备),没有问题。此外,用户尝试卸载并重新安装应用程序,结果相同。即使向他们发送私人构建,没有任何 ProGuard/Dexguard 保护也无济于事。

还有什么可能导致 Android 上的 java.lang.UnsatisfiedLinkError?或者我应该假设这个 HTC ROM 只是有问题???其他人在使用 Android 4.2.2 的 HTC One 上是否有类似的问题?

编辑 2013 年 7 月 24 日

在下面的评论中,另一位开发人员建议系统可能无法找到我的本机库。我通过从设置中完全删除本机库文件在 Genymotion 4.2.2 模拟器上进行了试验。在这种情况下,错误消息是不同的,得到:

W/System.err:原因:java.lang.UnsatisfiedLinkError:无法从加载程序dalvik.system.PathClassLoader[dexPath=/data/app/com.hyperionics.avar-2.apk,libra‌​ryPath=/加载cld data/app-lib/com.hyperionics.avar-2]:findLibrary 返回 null

在我从使用 Android 4.2.2 的 HTC One 用户那里收到的堆栈跟踪消息中,我看到了以下错误消息:

引起:java.lang.UnsatisfiedLinkError:未找到本机方法:com.hyperionics.avar.CldWrapper.detectLangNative:(Ljava/lang/String;)[Ljava/lang‌​/String;

对我来说,系统似乎根据需要找到了 libcld.so 文件,但没有找到它需要的方法。为什么???我知道该方法在那里,根据需要导出,并且所有其他设备和系统,也包括这些运行 Android 4.2.2 的设备和系统,都可以找到它。只有带有 4.2.2 的 HTC One 在那里失败了......

2013 年 7 月 25 日更新

开始赏金 50 代表。点,因为我没有 HTC One 并且卡住了。将接受指出解决问题的方法的答案 - 回答者将测试我的代码模块。证明它有效 - 或证明这确实是最近用于 HTC One 的 Android 4.2.2 ROM 中的一个错误。有问题的应用程序是https://play.google.com/store/apps/details?id=com.hyperionics.avar

2013 年 7 月 31 日更新

赏金的最后一天,仍然没有答案,没有建议......到目前为止,我收到的所有此类错误报告都来自欧洲,报告的品牌是“htc_europe”或“vodafone_fr”。也许错误仅限于欧洲(法国+德国)......如果有人将 HTC One 和 Android 更新到 4.2.2,如果错误发生在其他国家或其他提供商,我会很感兴趣。

格雷格

4

3 回答 3

13

在赏金期间没有令人满意的答案。我订购了该设备,并且必须为 Android 4.2.2 更新调试最有可能是设备 ROM 中的系统错误...

更新 6/20/2014 偶尔出现 UnsatisfiedLinkError 的另一个原因

事实证明,有时,从 Google Play 更新应用程序时,未正确安装本机库。也许安装程序空间不足,或者出现了其他一些奇怪的系统错误。另请参阅这个 SO question and answers。

2013 年 8 月 6 日更新 - 谜团解开了!

我从 Google Play 订购的 HTC One 到货了,而且……谜团解开了!同样的崩溃也发生在 Google Play 的原始 Android 4.2.2 上。问题是我的库名称:cld,它生成了一个名为 libcld.so 的共享库。显然系统有另一个同名的共享库,当然我期望的方法不存在......可能是一些“插件”将另一个 libcld.so 加载到进程内存中,而我自己的库被跳过了。我重命名了本机库,程序立即开始工作。

我不知道在不同版本的 Android 上可能会发生这种名称冲突……阅读这篇文章的人是否在 NDK 文档中的某处看到了关于它的警告?我想我将从现在开始在我创建的所有本机库上加上我的公司名称或其他名称。

于 2013-08-02T19:30:49.593 回答
1

您可以尝试从您的库中获取方法定义,并将其重写到您的一个类中,给该方法一个不同的名称。这可能很乏味,但至少你可以确定你的程序将能够找到方法......

于 2013-08-01T18:47:40.950 回答
1
defaultConfig {
    ...
    ndk {
        abiFilters "armeabi-v7a", "x86", "armeabi", "mips"
    }
}
于 2016-11-04T10:23:02.980 回答