gpt4 book ai didi

java - android构建系统如何处理加载 native 共享库的java库

转载 作者:太空狗 更新时间:2023-10-29 14:28:06 25 4
gpt4 key购买 nike

考虑以下情况:我有两个名为 P1 和 P2 的 android 项目,它们都生成一个使用相同进程 ID 的 apk,并将在 android 上的相同进程中运行。P1 和 P2 都使用 Java 库 JL1。 JL1 在运行时加载共享库 1 SL1。

我在运行时看到的是,在加载此 SL1 时,在某些时候我得到了 java/lang/UnsatisfiedLinkError。它还输出:共享库已打开。

是什么导致了这个问题?我假设 java 中的库代码在每个项目/apk 中都被复制,并且在运行时当 apks 在一个进程中合并时它忘记了副本。所以每个副本都加载它自己的共享库,导致已经加载的错误。

如果是这样,这不是不受欢迎的行为。因为,现在您永远无法在同一个进程中多次使用带有共享库的 Java 库。

[edit] 我发现每个 apk 都使用自己的类加载器(也在同一进程中)。这意味着每个 JL 都将按 apk 加载类,因此每个共享对象将被加载多次,从而导致错误。有人知道如何解决这个问题吗?是否可以让 apk 共享一个类加载器?

最佳答案

每个 apk 都有自己的类加载器。这意味着两个项目/apk 将拥有自己的库类副本。他们在运行时加载。因此,看起来相同的类实际上是副本。因此,在这样的类中加载 native 库将导致为每个加载的类加载它(即使这是在静态字段中完成的)。如果两个 apk 共享同一个进程,这会导致多次加载 native 共享对象时出现运行时错误。

关于java - android构建系统如何处理加载 native 共享库的java库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9840628/

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