JNI技術詳解

技術小胖子發表於2017-11-09

前段時間探究了點關於JNI技術方面的東西,在網上找,發現關於這方面的東西很少

基本上也是找不到,所以就決定寫下來,做個筆記:

JNI:

 JNI是Java Native Interface的縮寫,中文為JAVA本地呼叫。從Java1.1開始,Java Native Interface(JNI)標準成為java平臺的一部分,它允許Java程式碼和其他語言寫的程式碼進行互動。JNI一開始是為了本地已編譯語言,尤其是C和C++而設計的,

但是它並不妨礙你使用其他語言,只要呼叫約定受支援就可以了。

 我們知道Java是一種平臺無關性的語言,平臺對於上層的java程式碼來說是透明的,所以在多數時間我們是不需要JNI的

但在下面這幾種情況下你可能會用到JNI技術:

1.你的Java程式碼,需要得到一個檔案的屬性。但是你找遍了JDK幫助文件也找不到相關的API。 

2.在本地還有一個別的系統,不過他不是Java語言實現的,這個時候你的老闆要求你把兩套系統整合到一起。 

3.你的Java程式碼中需要用到某種演算法,不過演算法是用C實現並封裝在動態連結庫檔案(DLL)當中的。

對於上述的三種情況,如果沒有JNI的話,那就會變得異常棘手了。就算找到解決方案了,也是費時費力。其實說到底還是會增加開發和維護的成本。



對於JNI來說:其具體步驟如下:

1.先對Java檔案對應編譯  javac filename.java

filename.java檔案內容eg.

 


  1. class HelloWorld  
  2. {  
  3.     private native void print();  
  4.     static   
  5.     {  
  6.         System.loadLibrary(“HelloWorld”);  
  7.     }  
  8.     public static void main(String[] args)  
  9.     {  
  10.         new HelloWorld().print();  
  11.     }  
  12. }  

2.生成對應的.h檔案 javah -jni filename此命令執行完後在目錄中會生成HelloWorld.h檔案,該檔案中國包含了一個函式java_HelloWorld_print的宣告。

3.將對應的.c或.cpp檔案製作成動態庫

 cc -I/usr/lib/jvm/java-6-sun/include/linux  -I/usr/lib/jvm/java-6-sun/include -fPIC -shared -o libHelloWorld.so HelloWorld.c

 4.執行

 java -Djava.library.path=`.` HelloWorld

     本文轉自 驛落黃昏 51CTO部落格,原文連結:http://blog.51cto.com/yiluohuanghun/860269,如需轉載請自行聯絡原作者


相關文章