【问题标题】:LoadLibrary freezesLoadLibrary 冻结
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

  • 是的,根据我刚刚从作者那里听到的消息,在全局范围内创建 OpenGL 上下文时,ATI 卡存在一个已知问题。现在不知道怎么处理这个问题,这是一个特例,没有通用的解决方案?
  • 从某种意义上说,确实如此。实际上不是DllMain(),而是静态范围的初始化失败,在这种情况下几乎相同。
  • 是的,没错。您没有显式编写 DllMain,但编译器从 DllMain 运行您的初始化代码。
  • 如果您在 Windows XP/Windows Server 2003 下遇到这样的冻结问题(就像我一样)用 Google 搜索:确保在执行 loadLibrary 时不要从另一个线程中的标准输入读取阻塞。见这里:support.microsoft.com/kb/2009703
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-24
  • 2011-10-24
  • 2015-11-17
  • 2013-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多