Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何启动多个依赖的本机库?_Java_Java Native Interface_Java Web Start - Fatal编程技术网

Java 如何启动多个依赖的本机库?

Java 如何启动多个依赖的本机库?,java,java-native-interface,java-web-start,Java,Java Native Interface,Java Web Start,示例:我有两个共享对象(相同的应适用于.dll)。第一个共享对象来自第三方库,我们称之为libA.so。我用JNI包装了其中的一些,并创建了自己的库libB.so。现在libB依赖于libA webstart时,两个库都位于某些webstart工作区中。我的java代码尝试加载libB。此时,系统加载器将尝试加载不在系统库路径中的libA(java.library.path对此没有帮助)。最终结果是libB有一个不满意的链接,无法使用 我尝试在libB之前加载libA,但仍然不起作用。看来操作系

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

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


我尝试在libB之前加载libA,但仍然不起作用。看来操作系统想帮我加载。除了静态编译之外,还有什么方法可以使这项工作正常进行吗?

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

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


如果您使用自定义类加载器,您可以重写loadLibrary和findLibrary,这样它就可以从类路径的jar中找到您的库,并且还可以让它知道您的本机库依赖关系(也就是说,libB依赖于libA依赖于libX,那么当加载libB时,你可以发现自己并确保首先加载libA,在检查通知时,首先加载libX。然后操作系统不会试图找到一个不在你的路径中的库。这很麻烦,也有点痛苦,但确保Java找到它们并以正确的顺序加载它们是可行的

这两个本机库都打包到一个签名jar中,该jar列为

<nativelib ...> 


在JNLP文件中?

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

类加载器无法解决此问题,因为操作系统解决了本机依赖。