2014-02-10 51 views
0

我開發了我的Java應用程序,但突然被JNI卡住了。 我嘗試編譯並運行最簡單的JNI應用程序(只是爲了弄清楚什麼是錯的)。我有Win7 x64,JDK 7 32位,MinGW。 這是我的Java類與一個本地方法。被JNI困住 - 需要幫助

package my.pack; 

public class Foo 
{ 
    static 
    { 
     try 
     { 
      System.loadLibrary("foo"); 
     } catch (UnsatisfiedLinkError e) 
     { 
      System.out.println("Could not load native library"); 
     } 
    } 

    public static void main(String[] args) 
    { 

     Foo foo = new Foo(); 
     foo.foo(); 
    } 

    public native void foo(); 
} 

我跑

javah my.pack.Foo 

產生my_pack_Foo.h

/* DO NOT EDIT THIS FILE - it is machine generated */ 
#include <jni.h> 
/* Header for class my_pack_Foo */ 

#ifndef _Included_my_pack_Foo 
#define _Included_my_pack_Foo 
#ifdef __cplusplus 
extern "C" { 
#endif 
/* 
* Class:  my_pack_Foo 
* Method: foo 
* Signature:()V 
*/ 
JNIEXPORT void JNICALL Java_my_pack_Foo_foo 
    (JNIEnv *, jobject); 

#ifdef __cplusplus 
} 
#endif 
#endif 

然後,我實現它在my_pack_Foo.cpp

#include <jni.h> 
#include <cstdio> 
#include "my_pack_Foo.h" 
JNIEXPORT void JNICALL Java_my_pack_Foo_foo(JNIEnv *env, jobject obj) 
{ 
    puts("HELLO WORLD!"); 
} 

然後我編譯的cpp文件:

g++ -shared -o foo.dll my_pack_Foo.cpp -I c:/JDK/include -I c:/JDK/include/win32 

我嘗試運行編譯Foo.java與32位JVM,但得到的錯誤(foo.dll是系統路徑):

Exception in thread "main" java.lang.UnsatisfiedLinkError: my.pack.Foo.foo()V 
     at my.pack.Foo.foo(Native Method) 
     at my.pack.Foo.main(Foo.java:20) 

一切似乎是正確的,但有什麼不對?

+2

您可能會嘗試的兩件事是添加日誌記錄以指示成功的庫加載(即使理論上您已經記錄失敗),並使用objdump或其他方法檢查該庫,並查看問題中的函數是否真的存在,並以預期的名稱。既然你是從C++開始的,你可能會遇到一些與名稱混淆有關的問題? –

+1

你在'nm --extern-only --defined-only'你的DLL中看到了什麼? –

回答

1

鏈接時,請使用下列選項

-Wl,--export-all-symbols -Wl,--add-stdcall-alias -m32 -shared

使用扶養沃克(http://www.dependencywalker.com/)來驗證你的出口和前後看出區別。