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

时间:2010-06-04 16:07:56

标签: java dll jar java-native-interface 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加载的是什么。

有人可以帮助我吗?

由于

2 个答案:

答案 0 :(得分:2)

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

  1. 用户调用jar
  2. 将库提取到临时目录
  3. 将(bash)脚本写入临时目录
    • 设置/导出必要的环境变量
    • 这将启动第二个JRE实例
  4. 代码使脚本可执行
  5. 代码调用脚本
  6. 我知道,产生两个JRE实例以启动一个应用程序也不是我的首选。

答案 1 :(得分:0)

如果您使用的是Eclipse IDE,那么这个答案可能对您有帮助。

我在eclipse窗口遇到同样的问题,我无法从JNI添加依赖的.class文件。 在搜索了一段时间后,我开始知道“它是Eclipse中的已知错误”,为了解决这个问题,我将所有代码移植到NetBeans IDE。

Can not add all the classes files from the JNI folder in Eclipse (JAVA, Windows 7)