KVM本身只帶有cldc1.1的類庫,功能十分簡單,不能滿足用戶的需求,本篇介紹如何對KVM進行擴展。
對KVM進行擴展,在java層十分簡單,只要向在編譯Java代碼時多加一個文件就可以,沒什么要說的,麻煩的是假如在加入的Java類中有本地操作該怎么辦?本地的C語言代碼放在哪里編譯才能夠供KVM調用?
答案是KNI.下面就以KNI為主要內容介紹如何對KVM加以擴展,在最后附加一個具體的實現例子。
1. KNI的特點:
KNI(K Native Interface)是SUN的KVM(K Virtual Machine)所使用的本地方法調用機制。
JNI(Java Native Interface)是已經為我們所熟悉的Java本地方法調用機制,JNI一般使用在J2SE或J2EE平臺上,本地方法被編進動態鏈接庫,在運行時由Java虛擬機載入。
KVM中也需要本地調用,但JNI是“重量級”的本地調用方式,在使用時消耗的資源較多,所以針對KVM設計出了KNI,KNI被稱為是JNI的一個簡化版,是“輕量級”的本地調用方式。KVM不能加載動態鏈接庫,所以在KNI機制下,本地方法不是寫在庫中,而是編入虛擬機內部。
以下是KNI與JNI最重要的一些區別:
KNI是“實現層”的API,即它是虛擬機實現的一部分,修改KNI的API就要重新編譯虛擬機,這些API的細節對于Java程序員來說是不可見的;而JNI的API是在運行時動態加載進來的,它的修改與虛擬機無關,JNI的API對于Java程序員來說是可見的。
KNI的函數建在虛擬機內部,只能為此虛擬機所獨享;而JNI的函數放在動態鏈接庫中,可以為多個虛擬機共用。
由于在虛擬機內部,KNI的很多操作方式與虛擬機有關,在傳遞參數和控制對象的時候都要先經過一些非凡的處理;JNI的調用方式比較直接,但可能會增加安全隱患。
KNI是JNI的簡化版,功能也會弱一些,它不能創建對象,也不能調用Java層的方法。
總之,“在虛擬機內部”是KNI所有特點的根源,記得這一點,KNI的所有內容都非常輕易理解。
下文各節對KNI的各個方面做一下介紹,只詳述那些KNI所特有的內容,更全面的內容可以參考KVM附帶的KNI specification.
2. 數據類型:
2.1 原始類型:

上表中間一列是KNI所提供的8種原始類型,它們的長度與所對應的Java原始類型的長度相同。
2.2 對象類型:

上圖是KNI所支持的對象類型,其實所有對象都可作為jobject,只是對圖中所示的這些object類的子類有非凡的支持,比如為數組類提供了操作數組元素的方法。
2.3 返回類型:

“返回類型”也就是本地方法的返回值的類型,KNI對它們有專門的定義。
上表右邊一列即本地方法的返回類型。
進入討論組討論。2.4 字符串類型、類描述符、字段描述符:
新聞熱點
疑難解答