我在 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() 并指定一个目录,但想知道是否还有其他方法,因为据我所知,您必须以这种方式单独加载所有依赖库。
依赖库由操作系统自动加载,因此 JVM/Java 无法控制该过程。换句话说,不幸的是,您将被迫了解 Windows 加载库的方式。
针对您的具体情况,我想到了两种解决方案:
SetDllDirectory
获取包含库的目录,这样 Windows 就会在那里找到依赖的库,而你不必乱搞 PATH
。 (如果您使用的是 Java 22+,则可以使用 FFM API 来执行此操作,而不需要另一个单独的 JNI 库)。