gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 09:32:18 25 4
gpt4 key购买 nike

我有一个使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com