2011-07-11 48 views
2

我想從Java調用C子程序。我正在使用JNI。我創建了.java,.c和.h文件,並編譯了一個DLL。所有文件都在同一個文件夾中。但是當我運行該程序時,它顯示一個unsatisfiedlinkError。我哪裏去錯了...?JNI調用C子程序時出錯

由於我學習JNI,我使用的源代碼是從一個:http://www.ibm.com/developerworks/java/tutorials/j-jni/section2.html,事情我已經嘗試:

  • 使用代碼::塊(IDE)和作爲GCC編譯器創建DLL
  • 使用GCC命令行創建DLL(參考http://sig9.com/node/35
  • 我使用的Win7 32位,我想最重要的方法生成32位DLL
  • 所有我發現創建DLL的解決方案(共享庫)是MS VC/VCPP,我沒有在我的機器上現在。

問題在哪裏?正在生成的DLL文件沒有任何異常,但是當我運行Java代碼時,它會拋出異常。


PS:如果有任何理論上的例子,說明JNI的工作原理和實際它,然後親切地分享鏈接...被拋出

的消息或異常:

c:\myjava1>java Sample1 
    Exception in thread "main" java.lang.UnsatisfiedLinkError: Sample1.intMethod(I)I 
     at Sample1.intMethod(Native Method) 
     at Sample1.main(Sample1.java:11) 

很多時候創建dll文件後的一天結束時,我很確定它可能沒有問題,路徑有問題...我已將加載庫方法更改爲負載方法,但仍沒有運氣,......


由一個MOD建議: 我一直在討論有關的帖子這樣一個問題:JNI錯誤而調用C子程序,我張貼在這裏所有的代碼的註釋具有有限的字符... Sample1.c

#include "jni.h" 
#include"Sample_Sample1.h" 
JNIEXPORT jint JNICALL Java_Sample_Sample1_test(JNIEnv *env, jobject obj){ 
return(1); 
} 
void main(){} 

Sample1.java

package Sample; 

public class Sample1 
{ 
public native int test(); 
static{ 
System.loadLibrary("Sample1"); 
} 
public static void main(String[] args) 
{ 
Sample1 sample = new Sample1(); 
System.out.println(sample.test()); 
} 
} 

Sample_Sample1.h(使用產生JAVAH -j NI指令)

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

#ifndef _Included_Sample_Sample1 
#define _Included_Sample_Sample1 
#ifdef __cplusplus 
extern "C" { 
#endif 
/* 
* Class:  Sample_Sample1 
* Method: test 
* Signature:()I 
*/ 
JNIEXPORT jint JNICALL Java_Sample_Sample1_test 
    (JNIEnv *, jobject); 

#ifdef __cplusplus 
} 
#endif 
#endif 

任何人都可以指導我,其中的問題是什麼?在我提到,我使用的代碼是從教程的一個以前的職位,但simplyfy的事情我已經改變了代碼...雖然使用Java的** Sample.Sample1" 我得到:

C:\ myjava1>的Java Sample.Sample1 異常線程 「main」 java.lang.UnsatisfiedLinkError中:Sample.Sample1.test()我 在樣品。 Sample1.test(Native Method) at Sample.Sample1.main(Sample1.java:12)

+0

所有的代碼(.c和.java)都是從帖子中提到的鏈接中取得的,仍然重複着: buch11

+0

錯誤是什麼?是不是Java找不到你的庫(loadLibrary調用失敗),還是Java找不到你的方法?檢查您的DLL是否導出正確的名稱,例如使用依賴walker http://www.dependencywalker.com/。 – lmz

+1

拋出*什麼*異常?用什麼信息?這裏沒有足夠的信息。 – EJP

回答

2

您需要 have your library explicitly set on your path

可能是您在那裏使用的標誌不完全正確。試試這個:

gcc -Wall -D_JNI_IMPLEMENTATION_ -Wl,--kill-at \ 
    -I[Java_HOME]/include -I[Java_HOME]/include/win32 \ 
    -shared -o Sample1.dll Sample1.c 

MinGW GCC site

+0

仍然不能正常工作... – buch11

+0

爲此,您可以將該庫轉儲到項目主文件夾中。 – Nick

+0

@ buch11,.dll的完整路徑是什麼?當你嘗試執行你的程序時,你的路徑環境變量的價值是什麼?記住,這是你的路徑,而不是你的類路徑。 – buruzaemon

0

你是否通過從一個存根C++應用程序中調用它來檢查你的DLL?請特別注意您所調用方法的確切名稱(包括大寫字母)。

Javadoc UnsatisfiedLinkError說:「如果Java虛擬機無法找到本機聲明的方法的適當本地語言定義,則拋出此錯誤。這可能意味着名稱拼寫錯誤或者您的DLL不在JVM希望找到它的位置。

+0

JVM會期待它嗎?我已經設置了類路徑 – buch11

0

終於解決了使用System.load()方法,System.loadLibrary()方法的問題仍然不適用於我......它一直在給出相同的異常,而我認爲問題在於.dll感謝大家的支持和迴應......