閱讀132 返回首頁    go 阿裏雲 go 技術社區[雲棲]


《Java 本地接口規範》-JNI 的類型和數據結構

JNI 的類型和數據結構


本章討論 JNI 如何將 Java 類型映射到本地 C 類型。


基本類型

表 3-1 描述Java 基本類型及其與計算機相關的本地等效類型。

表 3-1 基本類型和本地等效類型

Java 類型

本地類型

說明

boolean

jboolean

無符號,8 位

byte

jbyte

無符號,8 位

char

jchar

無符號,16 位

short

jshort

有符號,16 位

int

jint

有符號,32 位

long

jlong

有符號,64 位

float

jfloat

32 位

double

jdouble

64 位

void

void

N/A

為了使用方便,特提供以下定義。

    #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 虛擬機類型簽名

類型簽名

Java 類型

Z

boolean

B

byte

C

char

S

short

I

int

J

long

F

float

D

double

L fully-qualified-class ;

全限定的類

[ type

type[]

( arg-types ) ret-type

方法類型

例如,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

  上一篇:go C編譯時`true&#39;+undeclared+(first+use+in+this+function)
  下一篇:go 一個使用FFmpeg庫讀取3gp視頻的例子-Android中使用FFmpeg媒體庫(三)