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

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

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

===============>>#1 票数:6

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

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

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

===============>>#2 票数:3 已采纳

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

===============>>#3 票数:1

两个本机库都打包到一个签名的 jar中,列在其中

<nativelib ...> 

在JNLP文件中?

  ask by basszero translate from so

未解决问题?本站智能推荐: