64位系统上的Java Native Interface 32位dll

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位运行?

您必须安装32位JVM,您才能运行代码。

如果要分发应用程序,则需要构建DLL的32位和64位版本。 然后使用以下技术加载正确的DLL,无论您的客户是否拱门。 在生成的输出文件中附加32或64(MyJniDLL32.dll和MyJniDLL64.dll)。

  String archDataModel = System.getProperty("sun.arch.data.model"); System.loadLibrary(libraryName+archDataModel); 

只是说明显而易见:要加载为32位架构构建的本机库,必须强制JVM以32位模式启动。

 java -d32 ... 

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

在为Chrome浏览器安装Java插件后,我收到了相同的错误消息(没有stacktrace)。

重新安装JDK / JRE(这是一个开发环境)为我修复了它。

  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

DLL由本机OS运行。 Java只是将调用委托给DLL,它与编译它的操作系统非常紧密。 一般来说,你不能以直接的方式做到这一点, 这是方式 。

但是有一些像WOW64这样的解决方案,这使得它成为可能。 请查看这些链接( 1,2 )

IA是Itanium架构,因此AMD jvm正在尝试加载为Itanium构建的dll ……不要认为这会起作用。

http://en.wikipedia.org/wiki/Itanium