Java Native Interface Error: Can't load IA 32-bit .dll on an AMD 64-bit platform
Java Native Interface Error: Can't load IA 32-bit .dll on an AMD 64-bit platform
我正开始学习如何使用 JNI。我正在遵循这个关于使用 JNI here 制作 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
}
}
以下头文件是由运行ning 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
终于有了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;
}
我使用 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)
我假设我需要更改使用 MinGW 编译 .dll 的方式,因为似乎存在 32 位/64 位不匹配问题。除了使用 64 位 dll 之外,我找不到任何东西,因为我现在正在尝试编译它,所以我没有。我是否必须切换到 32 位 java 或者有没有办法以不同的方式编译 dll?
确实会发生这种情况,因为您有一个 32 位 DLL 而您使用的是 64 位 Java。
本机库的 "bitness" 和您使用的 JVM 必须匹配。您唯一的选择是将 DLL 编译为 64 位,或使用 32 位 Java。没有办法让 64 位 Java 加载 32 位 DLL。
参见 this question 示例,了解如何在 MinGW 上使用 gcc 编译 64 位 DLL。最简单的尝试是在编译 DLL 时使用 -m64
开关。
我正开始学习如何使用 JNI。我正在遵循这个关于使用 JNI here 制作 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
}
}
以下头文件是由运行ning 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
终于有了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;
}
我使用 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)
我假设我需要更改使用 MinGW 编译 .dll 的方式,因为似乎存在 32 位/64 位不匹配问题。除了使用 64 位 dll 之外,我找不到任何东西,因为我现在正在尝试编译它,所以我没有。我是否必须切换到 32 位 java 或者有没有办法以不同的方式编译 dll?
确实会发生这种情况,因为您有一个 32 位 DLL 而您使用的是 64 位 Java。
本机库的 "bitness" 和您使用的 JVM 必须匹配。您唯一的选择是将 DLL 编译为 64 位,或使用 32 位 Java。没有办法让 64 位 Java 加载 32 位 DLL。
参见 this question 示例,了解如何在 MinGW 上使用 gcc 编译 64 位 DLL。最简单的尝试是在编译 DLL 时使用 -m64
开关。