LoadLibrary冻结

时间:2011-03-10 16:19:40

标签: windows api dll loadlibrary

我编译了一个JNI dll,我希望使用System.loadLibrary加载到我的Java应用程序中。这在使用MSVC ++ 2008 Express编译的dll的Windows XP上完全正常。

但是,在Windows 7上,我使用MSVC ++ 2010 Express编译dll(相同的选项,相同的处理器体系结构,相同的Java版本,只是不同的操作系统和编译器),应用程序将冻结loadLibrary调用。没有错误信息,根本没有反应。当我在冻结过程中尝试jstack时,它也会冻结(没有输出,没有终止)。以管理员身份运行应用程序无法解决此问题。

DLL及其所有依赖项都在java.library.path中。实际上,当我删除它们时,Java应用程序会告诉我它们已经丢失了,所以dll必须已经正确初始化而其他方法失败了。然而,调试证明它实际上loadLibrary冻结,之后没有任何东西。

有人能告诉我这里会发生什么吗?


更新

正如我在下面的评论中所述,这个问题似乎更深入。使用一个简单的C程序来加载所述DLL的一个依赖项已经使得冻结发生,所以这必然是Windows API的某种问题以及MSVC ++如何链接DLL(该依赖关系也是由MSVC ++ 2010 Express链接的)

1 个答案:

答案 0 :(得分:4)

你的DLL几乎肯定会调用试图从DLLMain()内部获取加载程序锁的东西。

您所描述的内容称为死锁,这些症状完全适合这一特定问题。