《Java 本地接口規範》-JNI 的類型和數據結構
JNI 的類型和數據結構
本章討論 JNI 如何將 Java 類型映射到本地 C 類型。
基本類型
表 3-1 描述Java 基本類型及其與計算機相關的本地等效類型。
表 3-1 基本類型和本地等效類型 |
||
#define JNI_FALSE 0
#define JNI_TRUE 1
jsize 整數類型用於描述主要指數和大小:
typedef jint jsize;
引用類型
JNI 包含了很多對應於不同 Java 對象的引用類型。JNI 引用類型的組織層次如圖3-1 所示。
圖 3-1 引用類型層次
在 C 中,所有其它 JNI 引用類型都被定義為與 jobject 一樣。例如:
typedef jobject jclass;
在 C++ 中,JNI 引入了虛構類以加強子類關係。例如:
class _jobject {};
class _jclass : public _jobject {};
...
typedef _jobject *jobject;
typedef _jclass *jclass;
域 ID 和方法 ID
方法 ID 和域 ID 是常規的 C 指針類型:
struct _jfieldID; /*不透明結構 */
typedef struct _jfieldID *jfieldID; /* 域 ID */
struct _jmethodID; /* 不透明結構 */
typedef struct _jmethodID *jmethodID; /* 方法 ID */
值類型
jvalue 聯合類型在參數數組中用作單元類型。其聲明方式如下:
typedef union jvalue {
jboolean z;
jbyte b;
jchar c;
jshort s;
jint i;
jlong j;
jfloat f;
jdouble d;
jobject l;
} jvalue;
類型簽名
JNI 使用 Java 虛擬機的類型簽名表述。表 3-2 列出了這些類型簽名。
表 3-2 Java 虛擬機類型簽名 |
|
short |
|
I |
|
F |
|
例如,Java 方法:
long f (int n, String s, int[] arr);
具有以下類型簽名:
(ILjava/lang/String;[I)J
UTF-8字符串
JNI 用 UTF-8 字符串來表示各種字符串類型。UTF-8 字符串和 Java 虛擬機所使用的一樣。UTF-8 字符串的編碼方式使得僅包含非空 ASCII 字符的字符序列能夠按每字符一個字節表示,但是最多隻能表示 16 位的字符。所有在\u0001
到\u007F
範圍內的字符都用單字節表示,如下所示:
字節中的七位數據確定了所表示字符的值。空字符 (\u000
) 和 \u0080
到\u07FF
範圍內的字符用一對字節表示, 即
x 和 y,如下所示:
值為 ((x&0x1f)<<6)+(y&0x3f)
的字符需用兩個字節表示。
\u0800
到 \uFFFF
範圍內的字符用三個字節表示,即
x,y,和 z:
值為 ((x&0xf)<<12)+(y&0x3f)<<6)+(z&0x3f)
的字符需用三個字節表示。
此格式與“標準” UTF-8 格式之間有兩個區別。第一,空字節 (byte)0
使用雙字節格式進行編碼,而不是單字節格式。這意味著 Java 虛擬機的 UTF-8 字符串不可能有嵌入的空值。第二,隻使用單字節、雙字節和三字節格式。Java 虛擬機不能識別更長的 UTF-8 格式。
最後更新:2017-04-02 06:52:01