Java 本机接口错误:无法在 AMD 64 位平台上加载 IA 32 位 .dll

rya*_*ott 3 c java dll java-native-interface mingw

我正在开始学习如何使用 JNI。我在这里遵循有关使用 JNI 制作 Hello World 的基本说明集。我有以下文件:

HelloJNI.java

      public class HelloJNI {

           static {
              System.loadLibrary("hello"); //Load native library hello.dll at runtime
           }

           //declare a native method sayHello() w/ no arguments and returns void
           private native void sayHello();

           public static void main(String[] args) {
               new HelloJNI().sayHello(); //invoke the native method
           }

     }
Run Code Online (Sandbox Code Playgroud)

以下头文件是通过javah HelloJNI从命令行运行机器生成的:

HelloJNI.h

    /* DO NOT EDIT THIS FILE - it is machine generated */
    #include <jni.h>
    /* Header for class HelloJNI */

    #ifndef _Included_HelloJNI
    #define _Included_HelloJNI
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
      * Class:     HelloJNI
      * Method:    sayHello
      * Signature: ()V
    */
    JNIEXPORT void JNICALL Java_HelloJNI_sayHello
      (JNIEnv *, jobject);

    #ifdef __cplusplus
    }
    #endif
    #endif
Run Code Online (Sandbox Code Playgroud)

最后我有C代码:

HelloJNI.c

    #include <jni.h>
    #include <stdio.h>
    #include "HelloJNI.h"

    JNIEXPORT void JNICALL Java_HelloJNI_sayHello(JNIEnv *env, jobject thisObj){
        printf("Hello World!\n");
        return;
    }
Run Code Online (Sandbox Code Playgroud)

我使用 MinGW 将 C 代码编译成 Windows 中的 .dll,如下所示:

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

它编译得很好,但是当我尝试运行 java 代码时java HelloJNI

我收到以下错误:

Exception in thread "main" java.lang.UnsatisfiedLinkError: E:\Users\Ryan\Repos\HelloJNI\hello.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 HelloJNI.<clinit>(HelloJNI.java:4)
Run Code Online (Sandbox Code Playgroud)

我假设我需要更改使用 MinGW 编译 .dll 的方式,因为似乎存在 32 位/64 位不匹配。除了使用 64 位 dll 之外,我找不到任何其他东西,因为我现在正在尝试编译它,所以我没有 64 位 dll。我必须切换到 32 位 java 还是有办法以不同的方式编译 dll?

Jes*_*per 5

这确实会发生,因为您有一个 32 位 DLL 并且正在使用 64 位 Java。

本机库的“位数”和您使用的 JVM 必须匹配。您唯一的选择是将 DLL 编译为 64 位,或使用 32 位 Java。没有办法让 64 位 Java 加载 32 位 DLL。

例如,请参阅有关如何在 MinGW 上使用 gcc 编译 64 位 DLL 的问题。最简单的尝试是-m64在编译 DLL 时使用开关。