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

标签 java dll jar java-native-interface shared-libraries

我想将我的应用程序作为独立的 jar 文件发布。 jar 文件应该包含所有的类文件,以及两个共享库。其中一个共享库是为 JNI 编写的,本质上是对另一个共享库(100% C)的间接访问。

我首先尝试在没有库的情况下运行我的 jar 文件,但可以通过 LD_LIBRARY_PATH 环境变量访问它们。效果很好。

然后我将 JNI 库放入 jar 文件中。我读过有关通过先将 jar 文件复制到某个临时目录来从 jar 文件加载库的信息,这对我来说效果很好(请注意,我想 100% C 库是像以前一样加载的)。

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

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

我试图通过在其临时文件上显式调用 System.load(...) 来强制 JVM 首先加载“100% C”库,但效果并不好。我怀疑系统在解析 libindirect.so 中的链接时正在寻找它,但并不关心 JVM 加载了什么。

谁能帮我解决这个问题?

谢谢

最佳答案

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

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

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

关于java - 如何从一个 jar 文件加载依赖于另一个库的库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2975858/

相关文章:

java - 如何将 MouseListener 添加到 JList 模型

java - TelephonyManager 在 MainActivity 中抛出空指针异常

java - 我不知道为什么这段代码会自己换行

c++ - DLL监控

java - 无法在 Intellij 2019.4 中找到或加载主类

java - 如何通过 JNI 将结构从 C 传回 Java

c# - 如何将我的 UserControl 从另一个项目 (Dll) 添加到我的 WPF 解决方案中?

java - 将自定义实用程序 JAR 添加到 Windows 系统路径

java - 带有外部 jar 的 Java 构建文件

C# 更正来自 C++ 的托管代码