0

我尝试使用 JNI 在我的 Java 项目中加载 C++ 代码。我有许多要加载的 DLL,不幸的是,它们之间存在循环依赖关系:dll A 需要 dll B,而后者又需要 dll A!我知道在 DLL 之间具有循环依赖关系是一种糟糕的编程设计,但在我的项目中,C++ 代码对我来说是一个黑匣子。

有没有办法加载具有循环依赖的DLL

我的代码很简单:

System.loadLibrary("myDLLA"); // needs dll B to be loaded!
System.loadLibrary("myDLLB"); // needs dll A to be loaded!
System.loadLibrary("myDLLC"); // needs dll B
// then call my native method implemented in dll C

Java 库路径没有问题,并且包含两个 DLL(它作为 VM 参数给出,我将其转储并在运行时检查它)。循环依赖由 Dependency Walker 确认。

错误是:

java.lang.UnsatisfiedLinkError: E:\...\myDLLA.dll: Can't find dependent libraries
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1928)
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1854)
at java.lang.Runtime.loadLibrary0(Runtime.java:845)
at java.lang.System.loadLibrary(System.java:1084)

我的项目是在 Eclipse (Helios) 中作为部署在 tomcat 6 服务器上的动态 Web 项目开发的。

4

1 回答 1

0

在 Windows 上,DLL 加载程序将遵循 PATH 来解析外部引用。您可以将 myDLLB.dll 的目录全局添加到 PATH(通过系统属性-> 高级),或者在启动 Java 应用程序(set 或 xset)的命令行上,或者从您的 Java 代码中添加。

于 2013-03-26T11:45:55.110 回答