LoadLibrary冻结

问题描述 投票:4回答:2

我已经编译了一个JNI dll,希望使用System.loadLibrary加载到Java应用程序中。在Windows XP上,使用MSVC ++ 2008 Express编译的dll可以很好地解决此问题。

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

DLL及其所有依赖项都在java.library.path中。实际上,当我删除它们时,Java应用程序会告诉我它们丢失了,因此dll必须已正确初始化,并且其他操作失败。但是,调试证明它实际上是loadLibrary冻结,此后什么也没有。

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


UPDATE

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

我已经编译了一个JNI dll,希望使用System.loadLibrary加载到Java应用程序中。在Windows XP上,使用MSVC ++ 2008 Express编译的dll可以很好地工作。但是,...

windows api dll loadlibrary
2个回答
4
投票

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


0
投票

对我来说,DLL被移动导致冻结。我解决了这个问题,检查文件是否存在并分配了句柄,将ExitCode设置为1,然后退出。当我调用导出函数时,它在C#中产生了一个很好的异常:

© www.soinside.com 2019 - 2024. All rights reserved.