作者  fcamel (飛啊!月下的小駱駝)  看板   P_fcamel
 標題  [Java]   JNI 心得
 時間  Sat Jan 31 16:05:27 2004


本篇文件只描述JNI大概是什麼, 用途, 和運作原理的簡單說明,
因為我只懂這麼一點

http://www.jjhou.com/jjtbooks-thinking-in-java-2e.htm

pdf檔的附錄B有不錯的入門指引, 這篇文件是看完該附錄後的心得


JNI (Java Native Interface)提供呼叫native method的方法,
比方寫系統程式或要針對特殊硬體處理, Java本身辦不到,
這時可透過JNI寫好method的介面(宣告), 而實作的部份由其它language來實作,
根據Think in Java 2/e Appendix B所言, 目前只有C/C++支援(*1)

以Design Pattern來說, JNI使用了Bridge, 這樣或許會較好理解

實作方式
1.
寫好Java的程式後, 在需要的method前加上key word "native",
該method不需實作內容
ex:
private native void ShowMessage(String msg);

使用javah -jni編譯, 會產生C/C++使用的header

在Java程式裡使用System.loadLibrary(String)引入待會用C/C++寫好的lib

2.
在C/C++裡引入剛才產生的header, 寫出實作部份,
function命名必須產用
Java_Class_Method方式, JVM才能正確引入,
ex:
Java_ShowMessage_ShowMessage(JNIEnv *, jobject, jstring);

( javah會產生出這個宣告 )

3.
把C/C++程式編成Win32下的DLL or UN*X下的so, (動態函式庫)
當然名稱要和Java程式裡System.loadLibrary()的參數一致

4.
麻煩的地方在於JNIEnv包含和JVM溝通的方式, 這部份要好好K文件

5.
若要和大量舊有的C/C++ lib合作, 建議使用Design Pattern的Adaptor


PS

*1 JPython也可達到相似功能, 它是直譯器, 可把Java和Python寫在一起的code,
   直接轉成Java bytecodes