Android NDK不满意链接错误-一个令人惊讶的原因

Android NDK不满意链接错误-一个令人惊讶的原因,android,android-ndk,unsatisfiedlinkerror,Android,Android Ndk,Unsatisfiedlinkerror,2013年8月7日更新: 现在问题已经解决了,但是错误的原因是出乎意料的,所有常见的错误嫌疑在一开始就被消除了,我学到了一些新的东西。见下面我的答案 我在这里非常绝望。有一个带有本机库的Android应用程序,我在其中调用一个方法。我测试的所有系统都没有问题,该程序在Google Play上运行,没有任何故障报告,被数千名用户使用。现在,一款适用于HTC One手机的新ROM——Android版本4.2.2——已经面世。用户声称这是官方版本,从官方渠道升级。当他们试图启动我的应用程序时,它崩溃

2013年8月7日更新: 现在问题已经解决了,但是错误的原因是出乎意料的,所有常见的错误嫌疑在一开始就被消除了,我学到了一些新的东西。见下面我的答案


我在这里非常绝望。有一个带有本机库的Android应用程序,我在其中调用一个方法。我测试的所有系统都没有问题,该程序在Google Play上运行,没有任何故障报告,被数千名用户使用。现在,一款适用于HTC One手机的新ROM——Android版本4.2.2——已经面世。用户声称这是官方版本,从官方渠道升级。当他们试图启动我的应用程序时,它崩溃了,堆栈跟踪显示:

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

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

还有什么会导致Android上的java.lang.UnsatifiedLink错误?或者我应该假设这个HTC ROM只是有缺陷吗???有没有其他人在搭载安卓4.2.2的HTC One上遇到过类似的问题

编辑日期:2013年7月24日 在下面的评论中,另一位开发人员建议系统在查找我的本机库时可能会遇到问题。我在Genymotion 4.2.2 emulator上进行了实验,从安装程序中完全删除了本机库文件。在这种情况下,错误消息不同,得到:

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

在使用安卓4.2.2的HTC One用户发送的堆栈跟踪消息中,我看到以下错误消息:

原因:java.lang.UnsatifiedLink错误:未找到本机方法:com.hyperionics.avar.CldWrapper.detectLangNative:(Ljava/lang/String;)[Ljava/lang‌​/弦

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

更新日期:7/25/2013 开始悬赏50个代表点,因为我没有HTC One,我被卡住了。我会接受一个答案,要么指出解决问题的方法——回答者会测试我的代码模块。以证明它是有效的——要么证明这确实是HTC One最近的安卓4.2.2 ROM中的一个bug。所讨论的应用程序是

更新日期:7/31/2013 悬赏的最后一天,仍然没有答案,没有建议…到目前为止,我收到的所有这些错误报告都来自欧洲,报告的品牌是“htc_Europe”或“vodafone_fr”。可能错误是局限于欧洲(法国+德国)只有……如果有人将HTC One和Android更新为4.2.2,我会对错误是否发生在其他国家或其他提供商感兴趣


Greg

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

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

更新6/20/2014偶尔出现不满意链接错误的另一个原因 事实证明,有时候,当从Google Play更新应用程序时,本机库没有正确安装。可能是安装程序空间不足,或者出现了其他奇怪的系统错误。请参阅和回答

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


我不知道在不同版本的Android上可能会出现这样的名称冲突……有人读过这篇文章吗?NDK文档中有关于它的警告吗?我想从现在起,我会在我用公司名称或其他东西创建的所有本机库上加上前缀。

该库是为armeabi-v7编译的吗?您还有其他运行stric的库吗在armeabi上运行。当您有两个使用armeabi和armeabi-v7编译的库时,系统很难决定加载哪个库。请尝试将库移动到与armeabi版本相关的适当文件夹中。@NikolaDespotoski-感谢您的回答!在APK的libs文件夹中,我有子文件夹“armeabi”、“armeabi-v7a”和“x86”。每个子文件夹都包含ins libcld.so和相关函数。ARM代码是在“thumb”模式下为发布的代码编译的,在我的新开发版本中,我切换到了“ARM”模式。不知道还有什么好考虑的。相关的应用程序是你是对的,它应该简单明了地使用System.loadLibrary()。我敢肯定,HTC ROM在从哪个文件夹获取libcld时会感到困惑。我的直觉告诉我,从armeabi获取lib还是从armeabi-v7a获取lib是一个两难的选择。尝试使用运行API级别17的Genymotion emulator,它确实显示了所有Dalvik日志输出,您可以注意到系统在库和服务器上的外观
defaultConfig {
    ...
    ndk {
        abiFilters "armeabi-v7a", "x86", "armeabi", "mips"
    }
}