我正在使用Java Web Start启动一个依赖于第三方本地库的Java应用程序。然后,这些本地库使用LoadLibrary/dlopen加载另一个名为commonLib
的本地库作为它们的依赖项。
当不使用Web Start时,当本地库位于同一目录中时,一切正常。
然而,Web Start需要将本地库打包在jar文件中并在jnlp文件中引用,我已经这样做了:
<!-- Windows OS -->
<resources os="Windows">
<nativelib href="native/native-windows.jar" />
</resource>
<!-- Linux OS -->
<resources os="Linux">
<nativelib href="native/native-linux.jar" />
</resources>
<!-- Mac OSX -->
<resources os="Mac OS X">
<nativelib href="native/native-osx.jar"/>
</resources>
本地库可以正常加载,但无法加载它们的依赖项commonLib
- C++ LoadLibrary/dlopen调用失败,因为该文件存在于某个jar/cache文件夹中而不在当前库搜索路径上。
在Windows上,我能够通过在尝试加载JNI库之前在Java中预加载commonLib
来解决这个问题,方法如下:
System.loadLibrary("commonLib");
System.loadLibrary("myNativeLib");
然而,这种方法在OS X上不起作用——本地代码中的dlopen失败。显然,如果已经加载了库,dlopen并不聪明,不能避免尝试重新加载库。
是否有一种跨平台的方式可以在Java Web Start中打包和加载依赖于其他本地库的本地库?