Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java本机接口错误:Can';t在AMD 64位平台上加载IA 32位.dll_Java_C_Dll_Java Native Interface_Mingw - Fatal编程技术网

Java本机接口错误:Can';t在AMD 64位平台上加载IA 32位.dll

Java本机接口错误:Can';t在AMD 64位平台上加载IA 32位.dll,java,c,dll,java-native-interface,mingw,Java,C,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

我正在开始学习如何使用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
           }

     }
以下头文件是通过从命令行运行
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

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

这确实会发生,因为您有一个32位dll,并且您使用的是64位java

本机库的“比特数”和您正在使用的JVM必须匹配。您仅有的选项是将DLL编译为64位,或使用32位Java。无法让64位Java加载32位DLL


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

我将
-m64
标志放在前面,然后我得到了以下错误
HelloJNI.c:1:0:抱歉,未实现:64位模式未在#include ^
@ryanmattscott中编译。那么不幸的是,您使用的gcc不支持64位,但我引用的问题包含了其他可能的答案。例如,尝试使用常规的Mingw。
    #include <jni.h>
    #include <stdio.h>
    #include "HelloJNI.h"

    JNIEXPORT void JNICALL Java_HelloJNI_sayHello(JNIEnv *env, jobject thisObj){
        printf("Hello World!\n");
        return;
    }
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)