64位系统上的Java本机接口32位dll

64位系统上的Java本机接口32位dll,java,dll,java-native-interface,mingw,Java,Dll,Java Native Interface,Mingw,在使用Java本机接口时,我遇到了一个产生此错误的问题。我相信这是因为我用MinGW编译了.dll,它编译成32位的.dll,而我的系统是64位的,因此我的Java运行在64位。 有没有办法强迫我的Java以32位运行?你必须安装一个32位的JVM,然后才能运行你的代码 如果要分发应用程序,则需要构建32位和64位版本的DLL。然后使用以下技术加载正确的DLL,而不考虑您的客户。将32或64(myjnidl32.dll&myjnidl64.dll)追加到生成的输出文件中 E:\Code\Java

在使用Java本机接口时,我遇到了一个产生此错误的问题。我相信这是因为我用MinGW编译了.dll,它编译成32位的.dll,而我的系统是64位的,因此我的Java运行在64位。
有没有办法强迫我的Java以32位运行?

你必须安装一个32位的JVM,然后才能运行你的代码

如果要分发应用程序,则需要构建32位和64位版本的DLL。然后使用以下技术加载正确的DLL,而不考虑您的客户。将32或64(myjnidl32.dll&myjnidl64.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)`

DLL由本机操作系统运行。Java只是简单地将调用委托给DLL,DLL与编译它的操作系统紧密相连。一般来说,你不能用直接的方式来做


但也有类似的变通办法,这使它成为可能。请查看这些链接(,)

IA是安腾体系结构,因此AMD jvm正在尝试加载为安腾构建的dll…不要认为这会起作用


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


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

只是为了说明一个显而易见的问题:要加载为32位体系结构构建的本机库,必须强制JVM以32位模式启动

    String archDataModel = System.getProperty("sun.arch.data.model");
    System.loadLibrary(libraryName+archDataModel);
可能您需要为您的平台安装一个较旧的JVM(例如,Oracle在OS X上的Java 7仅为64位,您需要从他们的知识库中获取Apple的Java 6)

  • 下载mingw-w64
  • 更新环境变量路径
  • 创建一个名为test.C的C程序,该程序实现了您的方法
  • 在命令提示符下运行以下cmd

    gcc-Wl,--添加stdcall别名-I”%JAVA\u HOME%\include“-I”%JAVA\u HOME%\include\win32“-shared-o test.dll test.c


  • 你能告诉我你现在使用的JRE/JDK和OS版本吗(32/64位;我怀疑你使用的是Windows)?有关更多信息:链接帮助。我使用的是windows 7 ultimate x86_64和x86版本的jdk1.7.0_03。要加载32位DLL,您必须从32位应用程序(例如32位Java)进行加载。您可以在64位操作系统上运行32位应用程序,但反过来不行。好的,我运行了java-version,显然更改path环境变量中的文件夹是不够的。我使用了32位java.exe的地址,而不仅仅是java命令,它工作起来可能没有帮助,因为JVM不运行DLL。是操作系统做的。JVM只是将调用委托给DLL。我不同意。我构建32位DLL并运行32位JVM,在64位操作系统上一切正常。此外,他的跟踪显示java.lang.System.loadLibrary,因此JVM正在加载dll。JNI DLL 32 vs 64需要匹配JVM 32 vs 64.No。IA64是安腾,IA32是x86。IA代表“英特尔体系结构”,它不一定是安腾。
    错误:此Java实例不支持32位JVM。
    表明-d32/-d64选项仅在Solaris上有用;在Windows/Linux上,您需要安装适当的32位或64位JVM,并专门运行所需的JVM(例如,通过将其包含在系统路径中)。这是不正确的。可以在64位操作系统上执行32位JVM。DLL的调用方确定是否可以加载它。关于JVM本身是否可以作为32位程序运行,您是正确的。它可以。64位二进制文件无法加载32位DLL。这是这里的根本问题。
    java -d32 ...