我已经编译了一个JNI,我希望使用System.loadLibrary将它加载到我的Java应用程序中。这在Windows和使用MSVC++ 2008Express编译的dll上非常好。
但是,在Windows7上,我使用MSVC++ 2010 Express (相同的选项、相同的处理器架构、相同的Java、不同的操作系统和编译器)编译dll,应用程序将冻结在loadLibrary调用上。没有错误信息,根本没有反应。当我在冻结的进程上尝试jstack时,它也会冻结(没有输出,没有终止)。以管理员身份运行应用程序不会解决此问题。
DLL及其所有依赖项都在java.library.path中。实际上,当我删除它们时,Java应用程序会告诉我它们丢失了,所以dll肯定已经被正确初始化了,其他的东西也失败了。然而,调试证明,它实际上是loadLibrary冻结,之后什么都没有。
有人能告诉我这里会发生什么事吗?
更新
正如我在下面的评论中所说,这个问题似乎更深。使用一个简单的C程序来加载所述DLL的依赖项之一已经导致冻结,所以这肯定是Windows和MSVC++如何链接DLL的某种问题( MSVC++ 2010 Express也链接了该依赖项)。
发布于 2011-03-11 18:44:01
您的DLL几乎可以肯定地调用一些尝试从其DLLMain()内部获取加载程序锁的东西。
您所描述的是所谓的死锁,这些症状非常适合这个特定的问题。
https://stackoverflow.com/questions/5262552
复制相似问题