在64位系统上运行32位dll的Java本地接口

32
E:\Code\Java\JNITest>java test
Exception in thread "main" java.lang.UnsatisfiedLinkError: E:\Code\Java\JNITest\test.dll: Can't load IA 32-bit .dll on a AMD 64-bit platform
    at java.lang.ClassLoader$NativeLibrary.load(Native Method)
    at java.lang.ClassLoader.loadLibrary0(Unknown Source)
    at java.lang.ClassLoader.loadLibrary(Unknown Source)
    at java.lang.Runtime.loadLibrary0(Unknown Source)
    at java.lang.System.loadLibrary(Unknown Source)
    at test.main(test.java:16)`

在使用Java Native Interface时,我遇到了一个问题,生成了这个错误。我认为这是因为我使用MinGW编译了.dll文件,它编译成了32位的.dll文件,而我的系统是64位的,因此我的Java运行在64位上。 有没有办法强制使我的Java运行在32位上?


你能告诉我你现在正在使用的 JRE/JDK 和操作系统版本吗(32位/64位;我猜你正在使用 Windows)?更多信息请参见:https://forums.oracle.com/forums/thread.jspa?threadID=2271763 - ecle
这个链接可以帮助你:https://dev59.com/SGsy5IYBdhLWcg3wtwMd - 4b0
我正在使用Windows 7 Ultimate x86_64操作系统和JDK1.7.0_03的x86版本。 - Frank Vanbever
1
要加载一个32位的DLL,你必须从一个32位的应用程序中进行,例如32位的Java。你可以在64位操作系统上运行32位应用程序,但反过来不行。 - Peter Lawrey
好的,我运行了java -version命令,显然仅仅更改路径环境变量中的文件夹是不够的。我使用32位java.exe的地址而不是仅仅使用java命令,这样就可以正常工作了。 - Frank Vanbever
6个回答

30
你需要安装32位的JVM才能运行你的代码。如果你打算发布你的应用程序,你需要构建32位和64位版本的DLL。然后使用以下技术,无论客户端是什么架构都可以正确加载DLL。将32或64附加到生成的输出文件中 (MyJniDLL32.dll和MyJniDLL64.dll)。
    String archDataModel = System.getProperty("sun.arch.data.model");
    System.loadLibrary(libraryName+archDataModel);

那可能不会有帮助,因为JVM不运行DLL。是操作系统在运行它。JVM只是将调用委托给DLL。 - Santosh
5
我不同意。我编译了32位的DLL并在64位操作系统上运行32位的JVM,一切都很好。而且,他的跟踪显示java.lang.System.loadLibrary,因此JVM正在加载dll。JNI DLL 32位与64位需要与JVM 32位与64位匹配。 - Java42

8

显而易见的是:为了加载一个为32位架构构建的本地库,您必须强制JVM以32位模式启动。

java -d32 ...

可能您需要为您的平台安装较旧的JVM(例如,在OS X上,Oracle的Java 7仅支持64位,您需要从Apple的知识库中获取Java 6)。


1
Error: This Java instance does not support a 32-bit JVM. - user719662
1
这个Oracle FAQ建议-d32/-d64选项只在Solaris上有用;在Windows/Linux上,您需要安装适当的32位或64位JVM,并明确运行您想要的那个(例如,通过将其包含在系统路径中)。 - Ian Renton

1
  1. 下载mingw-w64
  2. 更新环境变量PATH。
  3. 创建一个名为test.c的C程序,其中包含您的方法实现。
  4. 在命令提示符中运行以下cmd

    gcc -Wl,--add-stdcall-alias -I"%JAVA_HOME%\include" -I"%JAVA_HOME%\include\win32" -shared -o test.dll test.c


1

在安装Chrome浏览器的Java插件后,我收到了同样的错误消息(没有堆栈跟踪)。

重新安装JDK / JRE(这是一个开发环境)为我解决了这个问题。


-2

2
IA64 是指Itanium,而IA32则是x86。IA代表“英特尔架构”,并不一定指Itanium。 - Luke Woodward

-2

DLL由本机操作系统运行。 Java只是将调用委托给与其编译的操作系统非常紧密耦合的DLL。通常情况下,您无法以简单的方式完成,但这里有方法

但是有一些解决方法,例如WOW64,可以实现。请查看这些链接(1,2)。


1
这不是真的。在64位操作系统上可以执行32位JVM。DLL的_caller_决定它是否可以被加载。您对JVM本身是否可以作为32位程序运行是正确的。它可以。64位二进制文件无法加载32位DLL。这是此处发挥作用的根本问题。 - Andrew T Finnell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接