Java呼叫本地介面:java.lang.UnsatisfiedLinkError
阿新 • • 發佈:2019-01-09
先從一個經典例子說起,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