1. 程式人生 > >Java呼叫本地介面:java.lang.UnsatisfiedLinkError

Java呼叫本地介面:java.lang.UnsatisfiedLinkError

 先從一個經典例子說起,Java如何呼叫本地介面。

步驟如下:

1.建立HelloWorld.java

class HelloWorld 
{
	static{
		System.loadLibrary("HelloWorld");
	}
	
	public native void myprint();

	public static void main(String[] args) 
	{
		new HelloWorld().myprint();
	}
}

2.編譯生成Class檔案HelloWorld

>javac HelloWorld.java

3.生成檔案頭HelloWorld.h

>javah -jni HelloWorld

4.C語言編寫本地方法HelloWorld.c

#include "HelloWorld.h"

JNIEXPORT void JNICALL
Java_HelloWorld_myprint(JNIEnv *env,jobject obj){
	printf("Hello World !\n");
	return;
}

5.編譯本地C方法生成類庫dll檔案或者so檔案

>gcc -Wl,--add-stdcall-alias -shared -Ic:\java\jdk1.6\include -Ic:\java\jdk1.6\include\win32 -o HelloWorld.dll HelloWorld.c
或者:
>cl -Ic:\Java\jdk1.6\include -Ic:\Java\jdk1.6\include\win32 -LD HelloWorld.c -FeHelloWorld.dll
如果沒有c的編譯環境需要安裝編譯環境或者gcc 引數:-I接目錄位置,中間無需空格
★關鍵 dll檔案需要存放到 jdk的bin目錄或者system32下面

6.測試HelloWorld

>java HelloWorld

Hello World !

         這個經典小例子一般在命令列下面沒有什麼問題,容易出錯的地方就是dll 存放位置不對。執行的時候無法載入dll。

常見錯誤:

       1. java.lang.UnsatisfiedLinkError: no HelloWorld in java.library.path

       2. Exception in thread "main" java.lang.UnsatisfiedLinkError: xxx.xxx.HelloWorld.myprint()V

       網上總結很多。錯誤1,主要是沒有辦法path路徑中載入。錯誤2主要是沒有myprint方法,類庫載入沒有問題。

       排除dll本身問題(網上不少人遇到),dll沒有問題,載入路徑也沒有問題,不能連線到方法。這個在命令列的時候不容易發現問題,移到生產環境中容易出現,可能你已經猜到了,HelloWorld.java包路徑,類的包路徑要和生成標頭檔案類包路徑一致

       http://www.360doc.com/content/09/0402/09/107226_2994393.shtml