我有一个使用 maven
构建的 jar。构建 jar 的项目没有 native 依赖项。除了少数配备 android 4.4.2
和 4.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/