《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 格式。

时间: 2024-09-14 06:37:34

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

《Java 本地接口规范》- JNI 函数(三)

字符串操作   NewString jstringNewString(JNIEnv *env, const jchar *unicodeChars, jsize len); 利用 Unicode 字符数组构造新的 java.lang.String 对象. 参数: env:JNI 接口指针. unicodeChars:指向 Unicode 字符串的指针. len:Unicode 字符串的长度. 返回值: Java 字符串对象.如果无法构造该字符串,则为 NULL. 抛出: OutOfMemoryE

《Java 本地接口规范》- JNI 函数(二)

对象操作   AllocObject jobjectAllocObject(JNIEnv *env, jclass clazz); 分配新 Java 对象而不调用该对象的任何构造函数.返回该对象的引用. clazz 参数务必不要引用数组类. 参数: env:JNI 接口指针. clazz:Java 类对象. 返回值: 返回 Java 对象.如果无法构造该对象,则返回NULL. 抛出: InstantiationException:如果该类为一个接口或抽象类. OutOfMemoryError:如

《Java 本地接口规范》- JNI 函数(一)

JNI 函数 本章为 JNI 函数提供参考信息.其中列出了全部 JNI 函数,同时也给出了 JNI 函数表的准确布局. 注意:"必须"一词用于约束 JNI 编程人员.例如,当说明某个 JNI 函数必须接收非空对象时,就应确保不要向该 JNI 函数传递 NULL.这时,JNI 实现将无需在该 JNI 函数中执行 NULL 指针检查. 本章的部分资料改编自 Netscape 的 JRI 文档. 该参考资料按用法对函数进行组织.参考部分按下列函数区域进行组织: 版本信息 类操作 异常 全局及

《Java 本地接口规范》- 调用 API

调用 API 调用 API 允许软件厂商将 Java 虚拟机加载到任意的本地程序中.厂商可以交付支持 Java 的应用程序,而不必链接 Java 虚拟机源代码. 本章首先概述了调用 API.然后是所有调用 API 函数的引用页. 若要增强 Java 虚拟机的嵌入性,可以用几种方式来扩展 JDK 1.1.2 中的调用 API. 概述 以下代码示例说明了如何使用调用 API 中的函数.在本例中,C++ 代码创建 Java 虚拟机并且调用名为 Main.test 的静态方法.为清楚起见,我们略去了错误

《Android的设计与实现:卷I》——第2章2.4 在Java中调用JNI实现方法

2.4 在Java中调用JNI实现方法 本节介绍如何在Java中调用JNI实现方法.JNI数据类型转换.JNI方法命名规则,以及JNI方法签名规则. 2.4.1 Java数据类型与JNI数据类型转换 Java中调用Native方法传递的参数是Java类型的,这些参数需要经过Dalvik虚拟机转化为JNI类型才能被JNI层识别.下面分基本类型和引用类型介绍这种转化关系. 1.基本类型转化关系 表2-1列出了基本类型的转化关系. 2.引用类型转化关系 JNI的引用类型定义了九种数组类型,以及jobj

Java的封装类型和原始类型的区别?那种性能好?

问题描述 Java的封装类型和原始类型的区别?在JavaWeb程序当中,pojo(javabean)实体类中,是声明为封装类型好还是原始类型好?(比如:int-Integer)例如:public class User{private int id;private Integer id1;}int 默认初始化为0:Integer初始化为null:如果在web前端通过ajax请求到后台的时候,参数传递为 id=&di1=后台获取参数值时:id=1id1=null然后,保存到数据库时,Integer是

Java编程思想学习笔记——类型信息

前言 运行时类型信息(RTTI:Runtime Type Information)使得我们可以在程序运行时发现和使用类型信息. Java在运行时识别对象和类的信息的方式: (1)一种是RTTI,它假定我们在编译时已经知道了所有的类型. (2)另一种是反射机制,它允许我们在运行时发现和使用类的信息. 为什么需要RTTI 以使用了多态的类层次结构的例子举例: 如上图,泛型是基类Shape,而派生出来的具体类有Circle,Square和Triangle. 这是一个类层次结构图,基类位于顶部,而派生类

java操作Excel处理数字类型的精度损失问题验证

java操作Excel处理数字类型的精度损失问题验证: 场景: CELL_TYPE_NUMERIC-->CELL_TYPE_STRING--->CELL_TYPE_NUMERIC POI版本:poi-3.10.1poi-3.9 Code: package poi; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.i

Java 8中的Optional 类型与 Kotlin 中的可空类型

Java 8中的Optional 类型与 Kotlin 中的可空类型 在 Java 8中,我们可以使用 Optional 类型来表达可空的类型. package com.easy.kotlin; import java.util.Optional; import static java.lang.System.out; /** * Optional.ofNullable - 允许传递为 null 参数 * Optional.of - 如果传递的参数是 null,抛出异常 NullPointerE