如何从jar文件加载依赖于另一个库的库

Phi*_*ppe 6 java dll java-native-interface jar shared-libraries

我想将我的应用程序作为一个自包含的jar文件发送.jar文件应包含所有类文件,以及两个共享库.其中一个共享库是为JNI编写的,实质上是另一个共享库(100%C).

我首先尝试运行没有库的jar文件,但可以通过LD_LIBRARY_PATH环境变量访问它们.这工作得很好.

然后我将JNI库放入jar文件中.我已经阅读过从jar文件中加载库,首先将它们复制到一些临时目录,这对我来说效果很好(请注意,100%C库,我想,像以前一样加载).

现在我想将两个库放入jar中,但我不明白如何确保它们都被加载.当然我可以将它们都复制到一个临时目录,但当我加载"间接"时,它总是给我:

java.lang.UnsatisfiedLinkError:/tmp/.../libindirect.so:/libpure.so:无法打开共享对象文件:没有这样的文件或目录

我试图通过在其临时文件上明确地调用System.load(...)来强制JVM加载"100%C"库,但这样做效果不佳.我怀疑系统在解析libindirect.so中的链接时正在寻找它,但不关心JVM加载了什么.

那个人可以帮助我吗?

谢谢

McD*_*ell 2

一种方法是从第一个 Java 进程生成另一个 Java 进程,生成适当的调用脚本。

  1. jar 由用户调用
  2. 库被提取到临时目录
  3. (bash) 脚本被写入临时目录
    • 这设置/导出必要的环境变量
    • 这将启动第二个 JRE 实例
  4. 该代码使脚本可执行
  5. 代码调用脚本

我知道,生成两个 JRE 实例来启动一个应用程序也不是我的第一选择。