Java本机接口错误:Can';t在AMD 64位平台上加载IA 32位.dll
我正在开始学习如何使用JNI。我遵循这个关于使用JNI创建Hello World的基本指令集。我有以下文件: HelloJNI.javaJava本机接口错误: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
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)