我正在學習如何使用JNI。我按照JNI here製作Hello World的基本指令。我有以下文件:Java本地接口錯誤:無法在AMD 64位平臺上加載IA 32位.dll
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
最後我有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代碼爲.dll文件在Windows中:
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不同?
我把'-m64'標誌出來前,然後我得到了以下錯誤'HelloJNI.c:1:0:對不起,沒有實現:64位模式不 的#include ^' –
ryanmattscott
@ryanmattscott編譯那麼你使用的gcc不幸的是不支持64位,但我引用的問題包含其他可能的答案。例如嘗試[Mingw-w64](http://mingw-w64.org/doku.php),而不是常規的Mingw。 – Jesper