另一个JNI UnsatisfiedLinkError DLL问题

时间:2011-08-01 08:20:10

标签: dll java-native-interface

我已经阅读了很多关于此的帖子,但没有一个解决我的问题。

我有一个非常小的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和GPSVC.DLL加载的其他DLL的LOADS是一个奇怪的,即使作为我的win7x64机器上的管理员,我无法运行取决于它 - 它说它没有找到...

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

    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);

但这没有任何区别。我可以后退使其静态链接,但我宁愿不。

关于我接下来可以尝试的任何想法? 安东尼

1 个答案:

答案 0 :(得分:0)

好吧,我使用的是Visual Studio 2010,但它也可以在2005上运行。

您可以尝试使用vcvarsall.bat配置VC编译器,您可以在/ MicrosoftVisualStudio20xx / VC中的ProgramFiles中找到它。

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

当我使用JNI时,我使用命令行来编译代码,我不得不在64位机器上配置编译器。

或者你可能会尝试通过命令行编译它。这是我最喜欢的教程http://www.ibm.com/developerworks/java/tutorials/j-jni/index.html