我如何Java webstart多个依赖的本机库?

bas*_*ero 16 java java-native-interface java-web-start

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

在webstarting时,两个库都在某个webstart工作区中.我的java代码试图加载libB.此时系统加载程序将尝试加载不在系统库路径中的libA(java.library.path不会帮助它).最终结果是libB有一个不满意的链接,无法使用.

我试过在libB之前加载libA,但是仍然无效.似乎操作系统想为我加载.除了静态编译之外,我有什么方法可以完成这项工作吗?

Jos*_*non 6

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

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

如果您使用自定义类加载器,您可以覆盖loadLibrary和findLibrary,以便它可以从类路径中的jar中找到您的库,如果您还使它知道您的本机库依赖项(即libB依赖于libA依赖于libX,然后在加载libB时你可以抓住自己并确保首先加载libA,然后检查该通知并首先加载libX.然后操作系统不会尝试找到不在你路径中的库.它很笨拙而且有点痛苦,但确保Java找到它们并以正确的顺序加载所有它们都可以工作.


bas*_*ero 5

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