【发布时间】:2011-03-10 16:19:40
【问题描述】:
我已经编译了一个 JNI dll,我想使用 System.loadLibrary 将它加载到我的 Java 应用程序中。使用 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 链接) .
【问题讨论】:
-
好的,这似乎是 DLL 和 Windows API
LoadLibrary的一个更深层次的问题。我还没有解决方案,但这与 Java 完全无关,因为在加载我的 DLL 的依赖项时,Windows API 是冻结的。我能够证明编写一个使用它的简单 C 程序。 -
是否有任何 DLL 提供的 DllMain?
标签: windows api dll loadlibrary