03-JNI 类型和数据结构

上一篇: 02-设计概述


        本章讨论 JNI 如何将 Java 类型映射为本地 C 类型。

3.1 原始类型

        下表描述了 Java 原始类型及其与机器相关的本地等价类型。

        为方便起见,定义如下:

#define JNI_FALSE  0
#define JNI_TRUE   1

        jsize 整数类型用于描述基数索引和大小:

typedef jint jsize;

3.2 引用类型

        JNI 包括许多与Java 对象相对应的、不同类型的引用类型。JNI 引用类型按以下层次结构组织:

jobjectjclass (java.lang.Class objects)jstring (java.lang.String objects)jarray (arrays)jobjectArray (object arrays)jbooleanArray (boolean arrays)jbyteArray (byte arrays)jcharArray (char arrays)jshortArray (short arrays)jintArray (int arrays)jlongArray (long arrays)jfloatArray (float arrays)jdoubleArray (double arrays)jthrowable (java.lang.Throwable objects)

        在 C 语言中,所有其他 JNI 引用类型的定义都与 jobject 相同。例如:

typedef jobject jclass;

        在 C++ 中,JNI 引入了一组假类来执行子类型关系。例如:

class _jobject {};
class _jclass : public _jobject {};
// ...
typedef _jobject *jobject;
typedef _jclass *jclass;

3.3 字段和方法 ID

        方法和字段 ID 是常规的 C 指针类型

struct _jfieldID;              /* opaque structure */
typedef struct _jfieldID *jfieldID;   /* field IDs */struct _jmethodID;              /* opaque structure */
typedef struct _jmethodID *jmethodID; /* method IDs */

3.4 值类型

        jvalue 联合类型在参数数组中用作元素类型。其声明如下:

typedef union jvalue {jboolean z;jbyte    b;jchar    c;jshort   s;jint     i;jlong    j;jfloat   f;jdouble  d;jobject  l;
} jvalue;

3.5 类型签名

        JNI 使用 Java VM 的类型签名表示法。下表列出了这些类型签名:

        例如,Java 方法:

long f (int n, String s, int[] arr);

        的类型特征,如下:

(ILjava/lang/String;[I)J

String的全称类文件位于:libcore/ojluni/src/main/java/java/lang/String.java

package java.lang;

3.6 修改后的 UTF-8 字符串

        JNI 使用修改后的 UTF-8 字符串来表示各种字符串类型。修改后的 UTF-8 字符串与 Java VM 使用的字符串相同。修改后的 UTF-8 字符串经过编码后,只包含非空 ASCII 字符的字符序列,可使用每个字符一个字节来表示,但所有 Unicode 字符均可表示。

        \u0001 到 \u007F 范围内的所有字符都用一个字节表示,如下所示:

0xxxxxxx

        字节中的七位数据给出了所代表字符的值。

        空字符 ( '\u0000' ) 和范围在 '\u0080' 到 '\u07FF' 之间的字符由一对字节 x 和 y 表示:

x: 110xxxxx x: 110xxxxx
y: 10yyyyyy y: 10yyyyyy

        字节表示值为 ((x & 0x1f ) << 6 ) + (y & 0x3f ) 的字符。

        '\u0800' 至 '\uFFFF' 范围内的字符由 3 个字节 x、y 和 z 表示:

x: 1110xxxx x: 1110xxxx
y: 10yyyyyy y: 10yyyyyy
z: 10zzzzzz z: 10zzzzzz

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

        码位在 U+FFFF 以上的字符(即所谓的补充字符)通过对其 UTF-16 表示形式的两个代理码单元进行单独编码来表示。每个代理编码单元由三个字节表示。也就是说,补充字符由 u、v、w、x、y 和 z 六个字节表示:

u: 11101101 u: 11101101
v: 1010vvvv v: 1010vvvv
w: 10wwwwww w: 10wwwwww
x: 11101101 x: 11101101
y: 1011yyyy y: 1011yyyy
z: 10zzzzzz z: 10zzzzzz

        数值为 0x10000+((v&0x0f)<<16)+((w&0x3f)<<10)+(y&0x0f)<<6)+(z&0x3f) 的字符由这六个字节表示。

        多字节字符的字节在 class 文件中按大字节(高字节在前)顺序存储

        这种格式与标准 UTF-8 格式有两点不同。首先,空字符 (char)0 使用双字节格式编码,而不是单字节格式。这意味着修改后的 UTF-8 字符串永远不会嵌入空字符。其次,只使用标准 UTF-8 的一字节、二字节和三字节格式。Java 虚拟机不识别标准 UTF-8 的四字节格式,而是使用自己的两倍三字节格式。

        有关标准 UTF-8 格式的更多信息,请参见《Unicode Encoding Forms of The Unicode Standard》4.0 版第 3.9 节。


下一篇:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/506573.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入分析Android运行时环境ART:原理、特点与优化策略

摘要 随着移动互联网的快速发展&#xff0c;智能手机的性能和功能日益强大&#xff0c;其中Android操作系统因其开放性和灵活性而占据主导地位。Android运行时环境&#xff08;ART&#xff09;作为执行应用程序代码的关键组件&#xff0c;在系统性能和用户体验方面起着至关重要…

数据结构 - Trie树(字符串统计、最大异或对)

文章目录 前言Part 1&#xff1a;Trie字符串统计1.题目描述输入格式输出格式数据范围输入样例输出样例 2.算法 Part 2&#xff1a;最大异或对1.题目描述输入格式输出格式数据范围输入样例输出样例 2.算法 前言 本篇博客将介绍Trie树的常见应用&#xff0c;包括&#xff1a;Trie…

Java毕业设计-基于springboot开发的摄影跟拍预定管理系统-毕业论文+答辩PPT(有源代码)

文章目录 前言一、毕设成果演示&#xff08;源代码在文末&#xff09;二、毕设摘要展示1.开发说明2.需求分析3、系统功能结构 三、系统实现展示1、系统功能模块2、管理员功能模块3、摄影师功能模块4、用户功能模块 四、毕设内容和源代码获取总结 Java毕业设计-基于springboot开…

运用qsort函数进行快排并使用C语言模拟qsort

qsort 函数的使用 首先qsort函数是使用快速排序算法来进行排序的&#xff0c;下面我们打开官网来查看qsort是如何使用的。 这里有四个参数&#xff0c;首先base 是至待排序的数组的首元素的地址&#xff0c;num 是值这个数组的元素个数&#xff0c;size 是指每个元素的大小&am…

JVM(6)

JMM JVM定义了一种Java内存模型来屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果.在此之前,C/C直接使用物理硬件和操作系统的内存模型,因此,会由于不同平台下的内存模型差异,有可能导致程序在一套平台上并发完全正常,而在另…

Spring 事务传播机制

事务传播机制&#xff1a;多个事务⽅法存在调⽤关系时, 事务是如何在这些⽅法间进⾏传播的。 ⽐如&#xff1a;有两个⽅法A&#xff0c;B都被 Transactional 修饰,&#xff0c;A⽅法调⽤B⽅法 A⽅法运⾏时, 会开启⼀个事务。当A调⽤B时&#xff0c; B⽅法本⾝也有事务&#xf…

【CSS】(标准流部分)易忘知识点汇总

一、元素 块元素 常见的块元素&#xff1a; <h1>~<h6>、<p>、<div>、<ul>、<ol>、<li>行内元素 常见的行内元素&#xff1a; <a>、<strong>、<b>、<em>、<i>、<del>、<s>、<ins&…

Python实现DMI工具判断信号:股票技术分析的工具系列(3)

Python实现DMI工具判断信号&#xff1a;股票技术分析的工具系列&#xff08;3&#xff09; 介绍算法解释 代码rolling函数介绍完整代码 介绍 先看看官方介绍&#xff1a; DMI (趋向指标&#xff09; 用法 1.PDI线从下向上突破MDI线&#xff0c;显示有新多头进场&#xff0c;为…

喀秋莎软件如何编辑视频 Camtasia2023软件下载 电脑录屏剪辑软件推荐 Camtasia安装教程 微课视频制作方法 课件制作投屏软件

现在市面上的课件录制软件很多&#xff0c;许多人都听说过Camtasia&#xff0c;它是TechSmith旗下的一套专业屏幕录制软件&#xff0c;同时包含Camtasia录像器、Camtasia编辑器、Camtasia菜单制作器、Camtasia剧场、Camtasia播放器和Screencast的内置功能。 今天我们就来介绍如…

精准唇语同步:Wav2Lip 引领视频技术前沿 | 开源日报 No.188

Rudrabha/Wav2Lip Stars: 8.4k License: NOASSERTION Wav2Lip 是一个准确地在野外进行视频唇语同步的项目。 该项目的主要功能、关键特性和核心优势包括&#xff1a; 可以高精度地将视频与任何目标语音进行唇语同步适用于任何身份、声音和语言&#xff0c;也适用于 CGI 面孔和…

B树系列(详解)

目录 一、B-树 二、B树 三、B*树 四、时间复杂度 五、Mysql与B树系列 一、B-树 首先再说B树的性质以及其他的之前&#xff0c;先要说一声&#xff0c;好多人都把这个树叫B减树&#xff0c;其实不是&#xff0c;他就叫B树&#xff0c;至于原因我觉的没必要再这个名字上纠结…

基于Springboot的同城上门喂遛宠物系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的同城上门喂遛宠物系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系…