我怎样才能Java webstart多个依赖的本地库?

例如:我有两个共享对象(同样应用于.dlls)。第一个共享对象来自第三方库,我们将其称为libA.so.我用JNI包装了一些,创建了我自己的库libB.so.现在libB依赖于libA。

当webstarting时,这两个库都位于某个webstart工作区域。我的java代码试图加载libB。此时系统加载器将尝试加载不在系统库路径中的libA(java.library.path不会帮助这一点)。最终结果是libB有一个不满意的链接,不能使用。

我曾尝试libB之前加载libA,但仍然无法正常工作。似乎操作系统想为我加载。除静态编译外,是否有任何方法可以使此工作成为可能?

0

3 答案

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

0
额外

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

在libB之前加载libA应该可以工作,除非其中一个库具有未被记录的依赖关系,而不在路径中。我的理解是,一旦它进入系统loadLibrary调用(即Java已在其java.library.path中找到该库并且现在告诉OS加载它) - 它完全依赖于操作系统来查找任何相关库,因为那时操作系统正在为该进程加载库,而操作系统只知道如何查看系统路径。这似乎很难在Webstart应用程序中设置,但有一种解决方法不涉及静态编译。你可能会在你的图书馆的地方洗牌 - 我不确定

如果您使用自定义类加载器,则可以覆盖loadLibrary和findLibrary,以便它可以从类路径中的jar中找到您的库,并且如果您还使其知道您的本机库依赖项(即libB依赖于libA取决于libX,那么当加载libB时,你可以捕捉自己,并确保先加载libA,然后检查通知并首先加载libX,然后操作系统不会尝试找到不在你的路径中的库,它是klunky并且有点痛苦,但确保Java发现它们并以正确的顺序加载它们都可以工作。

0
额外
由于操作系统解析了本机依赖关系,类装入器无法解决问题。
额外 作者 basszero,

两个本地库都打包成一个签名的 jar,它被列为

 

在JNLP文件中?

0
额外