java - `java.lang.UnsatisfiedLinkError` 在我在 Android 4.4 中运行时构建的 jar 内。*

标签 java android android-4.4-kitkat

我有一个使用 maven 构建的 jar。构建 jar 的项目没有 native 依赖项。除了少数配备 android 4.4.24.4.4 的设备外,它在所有设备上都能正常运行。有人可以帮我解决这个问题吗?现在我的选择是禁用 5.0

以下的所有设备的该功能

编辑1:

进一步调试,我发现单例类的 LazyHolder 实现失败,因为在运行时构造函数无法解析静态类。

Caused by java.lang.UnsatisfiedLinkError: <muted>
       at com.a.b.controller.Controller.getInstance + 31(Controller.java:31)
       at com.a.b.controller.Controller.k + 184(Controller.java:184)
       at com.a.b.core.parser.f.m + 53(ff.java:53)
       at com.a.b.core.parser.f.n + 67(f.java:67)
       at a.b.c.d.e$classify$$inlined$use$lambda$1.invokeSuspend(e.java:90)
       at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith + 32(BaseContinuationImpl.java:32)
       at kotlinx.coroutines.DispatchedTask.run + 233(DispatchedTask.java:233)
       at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely + 594(CoroutineScheduler.java:594)
       at kotlinx.coroutines.scheduling.CoroutineScheduler.access$getSchedulerName$p + 60(CoroutineScheduler.java:60)
       at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run + 742(CoroutineScheduler.java:742)

编辑2:

我通过将 android 版本传递到我的 jar 中来创建修复程序,然后对于低于 4.4.* 或更低的版本不使用 LazyHolder。欢迎提出更好的解决方案。

最佳答案

我已经等待了一段时间才能得到这个问题的适当答案。不幸的是,这并不容易重现,并且可能是一个角落场景,因为大多数 Android 开发人员并不关心版本 4 或更低版本。所以我决定将我的所有发现作为这个问题的答案。

在我的场景中,我使用 LazyHolder( https://en.wikipedia.org/wiki/Initialization-on-demand_holder_idiom ) 实现来初始化我的中心对象。但问题是,当在 Android 4.4.* 设备上运行时,lazy-holder 无法获取静态类。该类在运行时不可用。我在 Android 4.4.2 设备上以 Debug模式运行该应用程序,并且能够清楚地指出这一点。

进一步阅读,我发现静态类可能进入另一个 dex 文件,而我的构造函数则完全不同(当在 4.4.* 中启用 multiDex 时,这似乎很常见)。

最后,黑客的目的是在 Android 版本低于 5 的情况下正常初始化,如果 Android 版本高于 5,则使用惰性持有者

关于java - `java.lang.UnsatisfiedLinkError` 在我在 Android 4.4 中运行时构建的 jar 内。*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56948090/

相关文章:

java - 使用来自外部类的信息 : Prisoner's Dilemma

android - Android 中的 HttpURLConnection 工作正常,但 OkHttp 在 Kitkat 上给出 "Network is unreachable"

android - 显示软键盘后禁用粘性沉浸模式

Java简单应用程序复杂性

java - 无法在 JOOQ 中设置引用麦粒肿 (RenderNameStyle.QUOTED)

java - iText如何同时使用PdfWriterPipeline和PdfSmartCopy?

android - 当第一个 Observable 为空时 RxJava concat

android - 使用多个 `POM file is invalid`时如何修复 `exclude`?

android - TextView 及其 ListView 的 capitalize 属性是否存在任何依赖关系

带有隐藏状态栏的Android float 窗口辅助功能问题