由于递归依赖性,Java中的UnsatisfiedLinkError(无法找到依赖库)

时间:2013-07-03 11:09:57

标签: java dll java-native-interface

我有一个Java应用程序,它使用System.loadLibrary()在运行时从指定的文件夹加载一些DLL。应用程序成功加载它在文件夹中找到的所有DLL之外的所有DLL。在加载失败的情况下,它会报告错误:

  

C:\ myapp \ lib \ foo.dll:找不到依赖库

我在DependencyWalker中打开了foo.dll但它没有报告任何问题(它列出了IESHIMS.DLL和WER.DLL缺失,但这些都是警告,据我所知,这些可以忽略)。依赖关系树列出了WSOCK32.DLL,KERNEL32.DLL和lib文件夹中包含的另一个特定于应用程序的DLL(并且成功加载了它)。

我最好的猜测是,foo.dll依赖于我的lib文件夹中不存在的另一个DLL,但我不知道如何获得有关此依赖项的更多信息。任何人都可以建议一种调试方法吗?

2 个答案:

答案 0 :(得分:0)

AFAIK Dependency Walker也会在lib本身所在的文件夹中搜索依赖库。 LoadLibrary不会这样做。我的猜测是,当您使用LoadLibrary加载依赖项时,您可以使用完整路径来执行此操作,这就是为什么可以找到并加载它,但是当您加载其他库时,它找不到。

答案 1 :(得分:0)

Dependency Walker有个人资料模式。使用它来查看哪些模块最终无法加载。您可能会看到一些最终找到的失败,因为一些模块通过尝试文件名的各种前缀和后缀来匹配。

请务必使用与您的可执行文件匹配的32位或64位版本(例如,javaw.exe)。

要了解DLL搜索路径,请参阅MSDN上的documentation