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

时间:2012-03-18 10:06:39

标签: java dll java-native-interface mingw

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

6 个答案:

答案 0 :(得分:26)

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

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

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

答案 1 :(得分:8)

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

java -d32 ...

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

  1. 下载 mingw-w64
  2. 更新您的环境变量路径。
  3. 创建一个名为 test.c 的C程序,该程序具有您方法的实现。
  4. 在命令提示符

    中运行以下cmd

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

答案 4 :(得分:-2)

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

但是有像WOW64这样的解决方法,这使得它成为可能。请查看以下链接(12

答案 5 :(得分:-2)

IA是Itanium架构,因此AMD jvm正在尝试加载为Itanium构建的dll ...不要认为这样可行。

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