另一个JNI不满意的链接错误DLL问题

另一个JNI不满意的链接错误DLL问题,dll,java-native-interface,Dll,Java Native Interface,我读过很多关于这方面的帖子,但没有一篇能解决我的问题 我有一个非常小的DLL,它允许Java进程发送windows消息。它只是简单地调用 FindWindowEx(...) SendMessage(...) 我已经用VS2005编译了它,并与/MT链接,一切都很好,但是如果我试图使我的DLL依赖于MSVCRT并与/MD链接,那么我会得到不满意的链接错误 java.lang.UnsatisfiedLinkError:MyDll.dll:找不到依赖库 根据depends.exe,它

我读过很多关于这方面的帖子,但没有一篇能解决我的问题

我有一个非常小的DLL,它允许Java进程发送windows消息。它只是简单地调用

    FindWindowEx(...)
    SendMessage(...)
我已经用VS2005编译了它,并与/MT链接,一切都很好,但是如果我试图使我的DLL依赖于MSVCRT并与/MD链接,那么我会得到不满意的链接错误

java.lang.UnsatisfiedLinkError:MyDll.dll:找不到依赖库

根据depends.exe,它缺少两个DLL,GPSVC.DLL和IESHIMS.DLL。第一个位于c:\windows\system32中,第二个位于winsxs路径中。从c:\windows\system32加载了许多其他DLL,GPSVC.DLL是一个奇怪的问题,因为即使作为我的win7x64机器上的管理员,我也无法运行,这取决于它-它说找不到它

无论如何,我尝试通过(简化-我无法控制Java.library.path)在Java中强制加载这两个DLL

但这没什么区别。我可以退一步使它静态链接,但我不想这样

我下一步可以试试什么?
Antony

嗯,我正在使用Visual Studio 2010,但它也可以在2005年使用

您可以尝试使用vcvarsall.bat配置VC编译器,您可以在/MicrosoftVisualStudio20xx/VC中的程序文件中找到该文件

您只需在命令行中使用以下选项之一启动vsvarsall.bat:x86或ia64或x86_amd64或x86_ia64。我不知道这是否有帮助,但这可能是VC编译器未配置为使用64位机器的问题之一

当我使用JNI时,我使用命令行编译代码,并且我必须在64位机器上配置编译器


或者您也可以尝试通过命令行编译它。这是我最喜欢的教程

我正在构建32位和64位版本的DLL,并根据需要使用x86或amd64运行vcvarsall。我的CL命令行是:CL/I%JAVA\u HOME%\include/I%JAVA\u HOME%\include\win32/nologo/W4/EHsc/O2/D“NDEBUG”/D“win32”/D\u USRDLL/MT/LD PresencePump.cpp/FePresencePump-%1.dll/link/subsystem:windows:这两个dll都使用上面的/MT静态链接工作,但是如果我使用/MD/D\u afxdl,那么我就有问题了。
    Field field = ClassLoader.class.getDeclaredField("usr_paths");
    field.setAccessible(true);
    String[] paths = (String[]) field.get(null);
    String[] tmp = new String[paths.length + 2];
    System.arraycopy(paths, 0, tmp, 0, paths.length);
    tmp[paths.length] = "c:/windows/system32";
    tmp[paths.length + 1] = "c:/Windows/winsxs/amd64_microsoft-windows-ie-ieshims_31bf3856ad364e35_8.0.7601.17514_none_c06d7c9c27da8591";
    field.set(null, tmp);