j2me中的KNI簡介

J2ME雜談(2)
J2ME虛擬機的移植。
在嵌入式系統中的JAVA虛擬機由多個版本,用的最廣的是SUN發佈的KVM。K的意思是這個虛擬機的大小是以kilo byte來衡量的(size小)。我們這裏主要介紹一下KVM的移植。需要聲明的是我的這些介紹只是一些原理上的,所以不會一個是step by step的移植教程。在需要的時候,我會儘可能的拿實際的代碼來示範。
因爲JAVA與C的運行環境在對stack,靜態變量, 類和指針的管理都存在一些差別,所以在從Java調用Native的C或C++ CODE時,增加了一層KNI(K native interfatce)接口用於解決轉換這些問題。即KNI是KVM在成功調用Native 的C code Method時所需要依靠的一些輔助函數。KNI的所有實現都包含在Kni.h和Kni.cpp(可從sun的官網上下載cldc的最新版本)中,作爲Interface必定是雙向的,主要功能包括獲得由KVM向Native C傳遞的參數, 處理Naïve C code的返回值等等。
KNI作爲一個移植過程的重要工具,大家必須非常熟悉。關於KNI API的介紹,可在google或baidu上搜索。也可以發郵件給我。
這裏舉一個例子:
KNIEXPORT KNI_RETURNTYPE_BOOLEAN 
Java_com_sun_midp_io_j2me_cbs_CBSImpl_readMsg() {
CB_APP_MSG_S *msg = NULL;
if ((msg = getCBSMessage()) == NULL) {
KNI_ReturnBoolean(KNI_FALSE); //返回值
}
KNI_StartHandles(3); //聲明native方法中將使用3個句柄
KNI_DeclareHandle(clazz); //聲明句柄clazz
KNI_DeclareHandle(obj); //聲明句柄obj
KNI_DeclareHandle(cb_content); //聲明句柄cb_content
KNI_GetParameterAsObject(1, obj); //獲得參數1並賦給obj
KNI_GetObjectClass(obj, clazz); //獲得obj所屬類的句柄存於clazz中
KNI_SetIntField(obj, KNI_GetFieldID(clazz, \"channel\", \"I\"), (jint)msg->channelNumber); //獲得成員變量channel的指針;將msg->channelNumber賦給channel
KNI_SetByteField(obj, KNI_GetFieldID(clazz, \"encoding\", \"B\"), ENCODING_UNICODE); //獲得成員變量encoding的指針;將ENCODING_UNICODE賦給encoding
KNI_SetIntField(obj, KNI_GetFieldID(clazz, \"msg_len\", \"I\"), getMsgLen(msg->cbContent));
KNI_GetObjectField(obj, KNI_GetFieldID(clazz, \"cb_content\", \"[B\"), cb_content); //獲得成員數組的指針
KNI_SetRawArrayRegion(cb_content, 0, CB_MAX_MSG_SIZE, (jbyte *)msg->cbContent); //清0
midpFree(msg);
msg = NULL;
KNI_EndHandles(); //與starthandle配對使用,表示結束
KNI_ReturnBoolean(KNI_TRUE);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章