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

标签 java android native

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

相关文章:

java - 为什么 Java 无法在终端服务器下使用 Firefox3 的 Verdana 字体? (访问控制异常)

java - 如何在 java 中使用 selenium webdriver 查找图像标签以及如何检查它是否已正确显示?

java - 使用 Google Guice 与静态方法注入(inject) Util 类?

php - android 无法从 php 检索 JSON 数据

android - 是否可以从测试应用程序中同时从相机 Intent 中选择图像或视频?

android - 如何以编程方式更改表盘

java - Android JNI 中的伪方法描述符

java - 如何在 Java 中打印出 native 堆栈跟踪?

android - 从 NDK 代码访问应用程序数据路径

java - Hibernate 自定义类型自动注册