有没有办法确保 System.loadLibrary 从与主加载 DLL 相同的目录加载依赖 DLL

问题描述 投票:0回答:1

我在 Windows 操作系统上使用 Java 工作。我使用 System.loadLibrary 加载名为 A.dll,它公开了一些 JNI 函数。 A.dll 依赖于 B.dll。我将 A.dll 和 B.dll 放在一个存储库上,告诉我的同事拉取该存储库,然后将检出的存储库的目录添加到他们的 PATH 环境变量中。我的设置在我的机器上有效,但我的同事收到 UnsatisfiedLinkError: The OS Cannot run %1.

我的同事通过将他们首先签出的目录放入 PATH 环境变量中解决了这个问题,这意味着他们的 PATH 环境变量中的其他位置有一个不兼容的 B.dll 版本。这个解决方案并不完全令人兴奋,并且希望消除 Apath 环境变量排序的依赖性。我能否确保 Java 将从签出目录加载 B.dll,而不是从其他地方加载。我知道您也可以使用 System.load() 并指定一个目录,但想知道是否还有其他方法,因为据我所知,您必须以这种方式单独加载所有依赖库。

java dll java-native-interface
1个回答
0
投票

依赖库由操作系统自动加载,因此 JVM/Java 无法控制该过程。换句话说,不幸的是,您将被迫了解 Windows 加载库的方式。

针对您的具体情况,我想到了两种解决方案:

  1. 将库 B 静态链接到 A.dll(如果您自己构建 A.dll),因此最终只有一个 DLL 文件。不过,您将需要 B 库的静态版本。
  2. 调用
    SetDllDirectory
    获取包含库的目录,这样 Windows 就会在那里找到依赖的库,而你不必乱搞
    PATH
    。 (如果您使用的是 Java 22+,则可以使用 FFM API 来执行此操作,而不需要另一个单独的 JNI 库)。
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.