JAVA / JNI - 加载具有循环依赖性的本机DLL

时间:2013-03-26 11:30:06

标签: java java-native-interface dependencies unsatisfiedlinkerror cyclic

我尝试使用JNI在我的java项目中加载c ++代码。我有很多DLL要加载,不幸的是有两个之间的循环依赖:dll A需要dll B,而这又需要dll A! 我知道在DLL之间存在循环依赖关系是一个糟糕的编程设计,但在我的项目中,c ++代码对我来说是一个黑盒子。

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

感谢您的帮助。

jpsi

详细信息:

我的代码非常简单:

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参数给出,我将其转储并在运行时检查它)。 Dependendcy 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项目。

如果您需要更多信息,请告诉我。

再次感谢您的帮助!!

1 个答案:

答案 0 :(得分:0)

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