考虑以下情况:我有两个名为 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/