| 作者 | 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
|