代码之家  ›  专栏  ›  技术社区  ›  basszero

如何启动Java WebScript多个、依赖的、本地的库?

  •  15
  • basszero  · 技术社区  · 17 年前

    示例:我有两个共享对象(相同的对象应该应用于.dlls)。第一个共享对象来自第三方库,我们称之为liba.so。我用JNI包了一些这个,并创建了我自己的库libb.so。现在伦敦银行同业拆借利率取决于伦敦银行同业拆借利率。

    当WebStarting时,两个库都位于某些WebStart工作区中。我的Java代码尝试加载LIB。此时,系统加载程序将尝试加载不在系统库路径中的liba(java.library.path对此没有帮助)。最终结果是libb有一个不满意的链接,不能使用。

    我试过在libb之前加载liba,但仍然不起作用。似乎操作系统想为我加载。除了静态编译之外,我还有什么方法可以完成这个工作吗?

    3 回复  |  直到 14 年前
        1
  •  6
  •   Joshua McKinnon    17 年前

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

    在libb之前加载liba应该是有效的,除非其中一个库有一个未被计算的依赖项,并且不在路径中。我的理解是,一旦它到达了一个系统加载库调用(即Java已经在Java.Labal.Py路径中找到了该库并告诉OS加载它)-它完全依赖于操作系统来查找任何依赖的库,因为在那个时候,操作系统正在加载该进程的库,而TH。操作系统只知道如何查看系统路径。对于WebStart应用程序来说,这似乎很难设置,但有一种方法可以解决这一问题,而不涉及静态编译。你可能会改变你的图书馆在哪里-我不确定

    如果使用自定义类加载器,则可以重写load library和findlibrary,以便它可以从类路径中的jar中找到库,并且如果还使它了解您的本地库依赖性(即libb依赖于liba依赖于libx,那么在加载libb时,可以先捕获自己并确保加载liba,然后在ch中检查该通知并首先加载libx。这样操作系统就不会试图找到一个不在您路径中的库。这是KLUNKY和有点痛苦,但确保Java找到它们,并按正确的顺序加载它们都可以工作。

        2
  •  3
  •   basszero    17 年前

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

        3
  •  1
  •   Adam Mitz    17 年前

    两个本机库都打包到 签署 JAR,列为

    <nativelib ...> 
    

    在JNLP文件中?

    推荐文章