【问题标题】:Native function no implementation found本机函数未找到实现
【发布时间】:2017-02-10 08:37:04
【问题描述】:

问题:20% 的用户正在接收:

Fatal Exception: java.lang.UnsatisfiedLinkError
No implementation found for java.lang.String com.example.utils.API.getHashString(android.content.Context) (tried Java_com_example_utils_API_getHashString and Java_com_example_utils_API_getHashString__Landroid_content_Context_2)

对于其他 80% 的应用程序运行良好,在我的测试设备上也不例外。 不知道是什么问题。

EDIT1: 库在启动画面上完美加载。在这一点上也不例外。

static { System.loadLibrary("my-lib"); }

EDIT2: 刚刚重现了错误。这绝对是随机的。应用程序函数调用工作正常,有时它开始失败。唯一的解决方法是重新安装应用程序。

【问题讨论】:

  • 尝试从静态构造函数中调用有问题的方法。它在相同的设备上会失败吗?
  • 你的意思是静态块吗?我想尝试,但我无法在真实用户的生产环境中测试所有解决方案。
  • 也许您可以使用firebase.google.com/docs/test-lab - 他们的免费套餐可能足以为您提供必要的输入。
  • 看起来您正在使用本机代码并且对应于库。您是否为所有平台编译过这个?像 arm64、armv7、mips、intel 等可能有 20% 的用户属于不受支持的平台
  • static {...} 块在哪里?造成这种情况的一个可能原因是代码在某些调用之前没有执行。

标签: java android android-ndk java-native-interface


【解决方案1】:

在我的评论和后来来自@stanislav-parkhomenko 的 cmets 之后,我将其重新发布为答案。谢谢!

我的评论:

静态 {...} 块在哪里?造成这种情况的一个可能原因是代码在某些调用之前没有执行。

后来自己证实是这个原因:

问题出在库初始化中。由于共享功能,启动画面并不总是运行,这就是为什么有时库没有加载的原因。

感谢 Xavier Rubio Jansana 的建议,它治愈了我的失明。

很高兴它有帮助!

【讨论】:

  • 我的应用程序在没有启用 proguard 的情况下运行良好,但在启用 proguard 后我得到了同样的错误。我被困在这里好几天了,我不想禁用 proguard 来发布。有什么可能的出路?
  • @bhaskar 如果仅在启用 Proguard 时失败,我很确定不是同一个问题。您应该在 SO 中创建一个包含尽可能多信息的新问题。
  • 对于收到此评论的任何人,已向here提出相关问题。
【解决方案2】:

此错误是由 Java 和您正在加载的本机库之间的方法签名不匹配引起的。很可能有 20% 的用户拥有同名的不同版本的库文件。如果它是您自己的库,请尝试给它一个相对唯一的名称并从绝对路径加载它以减少名称冲突的机会。

【讨论】:

    【解决方案3】:

    看起来它正在尝试加载原生库,Android Gradle 尚不支持原生代码。您应该仔细检查您图书馆的文档以确认;我试图查找它,但它看起来像是一个没有可公开访问的文档的商业图书馆。

    您可以将.so 文件放入src/main 中的jniLibs 文件夹中。这是在 AS 0.7.2 中引入的

    作为示例,请参阅@CommonsWare 中的 this,或查看this 官方示例页面(滚动到页面底部)

    是的,Android gradle 中仍然不支持本机库。只是我遵循了简单的 hack。效果很好。Check this

    【讨论】:

    • 不,这是我自己的库,只包含很少的 java 函数实现。
    猜你喜欢
    • 2016-04-01
    • 2013-08-03
    • 1970-01-01
    • 2021-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多