4

我已经编译了一个 JNI dll,我想使用System.loadLibrary. 使用 MSVC++ 2008 Express 编译的 dll 在 Windows XP 上运行良好。

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

DLL 及其所有依赖项位于java.library.path. 事实上,当我删除它们时,Java 应用程序会告诉我它们丢失了,因此 dll 必须已正确初始化,而其他一些东西则失败了。然而,调试证明它实际上是loadLibrary冻结的,之后什么也没有。

谁能告诉我这里可能发生了什么?


更新

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

4

1 回答 1

4

您的 DLL 几乎可以肯定是在调用试图从其内部获取加载程序锁的东西DLLMain()

您所描述的称为死锁,这些症状非常适合这个特定问题。

于 2011-03-11T18:44:01.717 回答