例子:我有两个共享对象(同样适用于 .dll)。第一个共享对象来自第三方库,我们将其称为 libA.so。我用 JNI 封装了其中的一些内容并创建了我自己的库 libB.so。现在 libB 依赖于 libA。

当网络启动时,这两个库都位于某个网络启动工作区域中。我的 java 代码尝试加载 libB。此时系统加载程序将尝试加载不在系统库路径中的libA(java.library.path对此无济于事)。最终结果是libB有一个不满足的链接,无法使用。

我尝试在 libB 之前加载 libA,但这仍然不起作用。似乎操作系统想为我加载。除了静态编译之外,还有什么方法可以使其工作吗?

有帮助吗?

解决方案 2

事实证明,静态编译是 webstart 多个依赖的本机库的唯一方法。

其他提示

我不确定这是否会以与 Webstart 完全相同的方式处理,但在处理一组本机库(在我们的例子中为 dll)时,我们在桌面应用程序中遇到了这种情况。

在 libB 之前加载 libA 应该可以工作,除非这些库之一具有未说明且不在路径中的依赖项。我的理解是,一旦到达系统 loadLibrary 调用(即Java 已在其 java.library.path 中找到该库,并且现在告诉操作系统加载它) - 它完全依赖于操作系统来查找任何依赖库,因为此时是操作系统正在加载该库进程的库,操作系统只知道如何在系统路径中查找。对于 Webstart 应用程序来说,这似乎很难设置,但有一种不涉及静态编译的方法可以解决这个问题。你也许可以随意调整你的图书馆的位置 - 我不确定

如果您使用自定义类加载器,则可以覆盖 loadLibrary 和 findLibrary,以便它可以从类路径中的 jar 中找到您的库,并且如果您还使其了解您的本机库依赖项(即libB 依赖于 libA 依赖于 libX,那么在加载 libB 时,您可以捕获自己并确保首先加载 libA,并在检查该通知时首先加载 libX。然后操作系统不会尝试查找不在您的路径中的库。虽然它很笨重而且有点痛苦,但确保 Java 找到它们并以正确的顺序加载它们是可行的。

两个本机库都打包成 jar 被列为

<nativelib ...> 

在 JNLP 文件中?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top