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

non_et 发布于 2018-03-03 java 最后更新 2018-03-03 01:04 697 浏览

例如:我有两个共享对象(同样应用于.dlls)。第一个共享对象来自第三方库,我们将其称为libA.so.我用JNI包装了一些,创建了我自己的库libB.so.现在libB依赖于libA。 当webstarting时,这两个库都位于某个webstart工作区域。我的java代码试图加载libB。此时系统加载器将尝试加载不在系统库路径中的libA(java.library.path不会帮助这一点)。最终结果是libB有一个不满意的链接,不能使用。 我曾尝试libB之前加载libA,但仍然无法正常工作。似乎操作系统想为我加载。除静态编译外,是否有任何方法可以使此工作成为可能?

已邀请:

qenim

赞同来自:

我不确定这是否会以与webstart完全相同的方式处理,但是在处理一组本机库(我们的例子中为dll)时,我们遇到了桌面应用程序中的这种情况。 在libB之前加载libA应该可以工作,除非其中一个库具有未被记录的依赖关系,而不在路径中。我的理解是,一旦它进入系统调用LoadLibrary呼叫(即Java已经发现,在其的java.library.path库,现在告诉OS加载它) - 它是完全依赖于操作系统上找到任何依赖库,因为那时操作系统正在为该进程加载库,而操作系统只知道如何查看系统路径。这似乎很难在Webstart应用程序中设置,但有一种解决方法不涉及静态编译。你可能会在你的图书馆的地方洗牌 - 我不确定 如果您使用自定义类加载器,您可以覆盖LoadLibrary和findLibrary,以便它可以在你的类路径罐子内找到您的图书馆,如果你还让它知道你的本地库的依赖(即libB取决于力霸取决于libx中,然后加载libB时,你可以发现自己,并确保您加载力霸第一,并在检查通知和第1负载libx中。然后OS不试图找到一个图书馆,是不是在你的路径,它是klunky和有点痛苦,但确保Java发现它们并以正确的顺序加载它们都可以工作。

eenim

赞同来自:

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

<nativelib ...> 
在JNLP文件中?

non_et

赞同来自:

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