2016-06-07 74 views
2

我正在學習如何使用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不同?

回答

3

確實發生這種情況是因爲您有一個32位DLL並且您使用的是64位Java。

本地庫和您使用的JVM的「位」必須匹配。您唯一的選擇是將DLL編譯爲64位,或者使用32位Java。沒有辦法讓64位Java加載32位DLL。

例如參見this question關於如何在MinGW上編譯一個帶有gcc的64位DLL。最簡單的嘗試是在編譯DLL時使用-m64開關。

+0

我把'-m64'標誌出來前,然後我得到了以下錯誤'HelloJNI.c:1:0:對不起,沒有實現:64位模式不 的#include ^' – ryanmattscott

+1

@ryanmattscott編譯那麼你使用的gcc不幸的是不支持64位,但我引用的問題包含其他可能的答案。例如嘗試[Mingw-w64](http://mingw-w64.org/doku.php),而不是常規的Mingw。 – Jesper

相關問題