【发布时间】:2013-07-21 20:20:04
【问题描述】:
我正在使用 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 中其他本机库的本机库?
【问题讨论】:
-
罐子里是否包含所有相关的本地人?
-
是的,请仔细检查。
标签: java java-web-start java-native-interface