前段時間探究了點關於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.
class HelloWorld { private native void print(); static { System.loadLibrary("HelloWorld"); } public static void main(String[] args) { new HelloWorld().print(); } }
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
本文出自 “驿落黃昏” 博客,請務必保留此出處http://yiluohuanghun.blog.51cto.com/3407300/860269