《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 范围内的字符都用单字节表示,如下所示:

《Java 本地接口规范》-JNI 的类型和数据结构

字节中的七位数据确定了所表示字符的值。空字符 (\u000) 和 \u0080\u07FF 范围内的字符用一对字节表示, 即 x 和 y,如下所示:

《Java 本地接口规范》-JNI 的类型和数据结构
值为 ((x&0x1f)<<6)+(y&0x3f) 的字符需用两个字节表示。

\u0800\uFFFF 范围内的字符用三个字节表示,即 x,y,和 z:

《Java 本地接口规范》-JNI 的类型和数据结构

值为 ((x&0xf)<<12)+(y&0x3f)<<6)+(z&0x3f) 的字符需用三个字节表示。

此格式与“标准” UTF-8 格式之间有两个区别。第一,空字节 (byte)0 使用双字节格式进行编码,而不是单字节格式。这意味着 Java 虚拟机的 UTF-8 字符串不可能有嵌入的空值。第二,只使用单字节、双字节和三字节格式。Java 虚拟机不能识别更长的 UTF-8 格式。

上一篇:人工智能如何解决数据中心的工作负载管理难题


下一篇:Linux文件查找及压缩常用知识总结