Android NDK UnsatisfiedLinkError – 一个令人惊讶的原因

前端之家收集整理的这篇文章主要介绍了Android NDK UnsatisfiedLinkError – 一个令人惊讶的原因前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
更新8/7/2013:
问题现在解决了,但错误的原因是非常意想不到的,所有这些错误的常见嫌疑人在开始时被消除,我已经学到了新的东西.看下面我的回答

我在这里很绝望有一个Android应用程序与本机库,从我称之为方法.我测试的所有系统都没有问题,而且该程序在Google Play中没有任何麻烦的报告,被数以千计的用户使用.现在,显然是一个新的ROM – Android 4.2.2版 – 用于HTC One手机.用户声称这是官方版本,升级形式是官方频道.当他们尝试启动我的应用程序时,它崩溃了,堆栈跟踪说:

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

并且我知道的方法名称在那里,并且在安装Android 4.1之前在同一台设备上工作正常.我在Android 4.2.2测试它在仿真器(没有这个特定的设备),没有问题.此外,用户尝试使用相同的结果卸载并重新安装该应用程序.即使发送私人构建,没有任何ProGuard / Dexguard保护也没有帮助.

还有什么可以导致Android上的java.lang.UnsatisfiedLinkError?或者我应该假设这个HTC ROM是简单的buggy? HTC One与Android 4.2.2有没有其他类似的问题?

编辑7/24/2013

在下面的评论中,另一位开发人员建议系统可能会遇到麻烦找到我的本机库.我通过完全从安装中删除本机库文件,对Genymotion 4.2.2仿真器进行了实验.在这种情况下,错误信息有所不同:

W/System.err: Caused by: java.lang.UnsatisfiedLinkError: Couldn’t load cld from loader dalvik.system.PathClassLoader[dexPath=/data/app/com.hyperionics.avar-2.apk,libra‌​ryPath=/data/app-lib/com.hyperionics.avar-2]: findLibrary returned null

在堆栈跟踪消息我从HTC One用户Android 4.2.2我看到这个错误消息:

Caused by: java.lang.UnsatisfiedLinkError: Native method not found: com.hyperionics.avar.CldWrapper.detectLangNative:(Ljava/lang/String;)[Ljava/lang‌​/String;

对我来说,似乎系统根据需要找到libcld.so文件,但是找不到需要的方法.为什么???我知道方法是在那里,根据需要导出,以及其他所有的设备和系统,也是运行Android 4.2.2的,找到它.只有HTC One与4.2.2在那里失败…

更新7/25/2013

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

更新7/31/2013

最后一天的赏金还没有答案,没有任何建议…到目前为止,所有这样的错误报告我来自欧洲,报告品牌是“htc_europe”或“vodafone_fr”.也许这个错误本地化到欧洲(法国德国)只有…如果有人在那里与HTC One和Android更新到4.2.2,如果错误发生在其他国家或其他提供商,我会感兴趣.

格雷格

解决方法

在赏金期间没有令人满意的答案.我订购的设备,将不得不调试最有可能是Android 4.2.2更新的设备ROM中的系统错误

Update 6/20/2014偶尔的不满意的链接错误的另一个原因

事实证明,有时候,当从Google Play更新应用程序时,本机库未正确安装.也许安装程序用完了空间,或者其他一些奇怪的系统错误,请参阅this SO question和答案.

更新8/6/2013 – 神秘解决

我的HTC One订购从Google Play到达,并且…神秘解决!来自Google Play的原始Android 4.2.2也发生了同样的事故.问题是我的库名称:cld,它生成一个名为libcld.so的共享库.显然系统有另一个同名的共享库,其中我期望的方法不存在,当然可能有一些“插件”将其他libcld.so加载到进程内存中,我自己的库被跳过.我更名为本地图书馆,该计划立即开始工作.

我不知道在Android的不同版本上有这样的名字冲突的可能性…有没有读过这个在NDK文档中看到一个警告?我想我将从现在开始,用我的公司名称或其他东西创建的所有本地图书馆.

猜你在找的Android相关文章