【问题标题】:Java Native Interface 32 bit dll on 64 bit system64 位系统上的 Java 本机接口 32 位 dll
【发布时间】:2012-04-03 04:30:33
【问题描述】:
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)吗?欲了解更多信息:forums.oracle.com/forums/thread.jspa?threadID=2271763
  • 我使用的是 windows 7 Ultimate x86_64 和 x86 版本的 jdk1.7.0_03
  • 要加载 32 位 DLL,您必须从 32 位应用程序例如32 位 Java。您可以在 64 位操作系统上运行 32 位应用程序,但反之则不行。
  • 好的,我运行了 java -version,显然更改路径环境变量中的文件夹还不够。我使用了 32 位 java.exe 的地址,而不仅仅是 java 命令,它工作了

标签: java dll java-native-interface mingw


【解决方案1】:

您必须安装 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。
  • 我不同意。我构建 32 位 DLL 并运行 32 位 JVM,在 64 位操作系统上一切正常。此外,他的跟踪显示 java.lang.System.loadLibrary 因此 JVM 正在加载 dll。 JNI DLL 32 vs 64 需要匹配 JVM 32 vs 64。
【解决方案2】:

简单地说:要加载为 32 位架构构建的本机库,您必须强制 JVM 以 32 位模式启动。

java -d32 ...

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

【讨论】:

  • Error: This Java instance does not support a 32-bit JVM.
  • This Oracle FAQ 建议 -d32/-d64 选项仅在 Solaris 上有用;在 Windows/Linux 上,您需要安装适当的 32 位或 64 位 JVM 并专门运行您想要的(例如,通过将其包含在系统路径中)。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:
    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

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

      • 这不是真的。可以在 64 位操作系统上执行 32 位 JVM。 DLL 的调用者 决定它是否可以被加载。您对 JVM 本身是否可以作为 32 位程序运行是正确的。它可以。 64 位二进制文​​件无法加载 32 位 DLL。这是这里的根本问题。
      【解决方案6】:

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

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

      【讨论】:

      • 没有。 IA64 是安腾,IA32 是 x86。 IA 代表“英特尔架构”,不一定是安腾。
      猜你喜欢
      • 2012-09-11
      • 2012-03-16
      • 1970-01-01
      • 1970-01-01
      • 2016-10-07
      • 2012-11-07
      • 1970-01-01
      • 1970-01-01
      • 2011-03-24
      相关资源
      最近更新 更多