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.mzph.cn/news/716106.shtml

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

相关文章

逻辑回归与决策边界解析

目录 前言1 逻辑回归基础1.1 Sigmoid函数&#xff1a;打开分类之门1.2 决策函数&#xff1a;划定分类界限1.3 逻辑回归详解 2 决策边界2.1 线性决策边界2.2 非线性决策边界2.3 决策边界的优化 3 应用与实例3.1 垃圾邮件分类&#xff1a;精准过滤3.2 金融欺诈检测&#xff1a;保…

.idea文件详解

.idea文件的作用&#xff1a; .idea文件夹是存储IntelliJ IDEA项目的配置信息&#xff0c;主要内容有IntelliJ IDEA项目本身的一些编译配置、文件编码信息、jar包的数据源和相关的插件配置信息。一般用git做版本控制的时候会把.idea文件夹排除&#xff0c;因为这个文件下保存的…

ISO_IEC_18598-2016自动化基础设施管理(AIM)系统国际标准解读(一)

██ ISO_IEC_18598-2016是什么标准&#xff1f; ISO/IEC 18598国际标准是由ISO&#xff08;国际标准化组织&#xff09;/IEC&#xff08;国际电工委员会&#xff09;联合技术委员会1-信息技术的第25分委员会-信息技术设备互连小组制定的关于信息基础设施自动化管理的国际标准&…

【AI Agent系列】【MetaGPT多智能体学习】6. 多智能体实战 - 基于MetaGPT实现游戏【你说我猜】(附完整代码)

本系列文章跟随《MetaGPT多智能体课程》&#xff08;https://github.com/datawhalechina/hugging-multi-agent&#xff09;&#xff0c;深入理解并实践多智能体系统的开发。 本文为该课程的第四章&#xff08;多智能体开发&#xff09;的第四篇笔记。今天我们来完成第四章的作…

java垃圾回收

垃圾回收 一个对象如果不再使用&#xff0c;需要手动释放&#xff0c;否则就会出现内存泄漏。我们称这种释放对象的过程为垃圾回收&#xff0c;而需要程序员编写代码进行回收的方式为手动回收。 内存泄漏指的是不再使用的对象在系统中未被回收&#xff0c;内存泄漏的积累可能…

【ArcGIS Pro二次开发】(83):ProWindow和WPF的一些技巧

在ArcGIS Pro二次开发中&#xff0c;SDK提供了一种工具界面【ArcGIS Pro ProWindow】。 关于ProWindow的用法&#xff0c;之前写过一篇基础的教程&#xff1a; 【ArcGIS Pro二次开发】(13)&#xff1a;ProWindow的用法_arcgispro二次开发教程-CSDN博客 主要是对几个常用控件…

【嵌入式实践】【芝麻】【设计篇-2】从0到1给电动车添加指纹锁:项目可行性分析

0. 前言 该项目是基于stm32F103和指纹模块做了一个通过指纹锁控制电动车的小工具。支持添加指纹、删除指纹&#xff0c;电动车进入P档等待时计时&#xff0c;计时超过5min则自动锁车&#xff0c;计时过程中按刹车可中断P档状态&#xff0c;同时中断锁车计时。改项目我称之为“芝…

EMR StarRocks实战——猿辅导的OLAP演进之路

目录 一、数据需求产生 二、OLAP选型 2.1 需求 2.2 调研 2.3 对比 三、StarRocks的优势 四、业务场景和技术方案 4.1 整体的数据架构 4.2 BI自助/报表/多维分析 4.3 实时事件分析 4.5 直播教室引擎性能监控 4.4 B端业务后台—斑马 4.5 学校端数据产品—飞象星球 4…

Ajax(黑马学习笔记)

Ajax介绍 Ajax概述 我们前端页面中的数据&#xff0c;如下图所示的表格中的学生信息&#xff0c;应该来自于后台&#xff0c;那么我们的后台和前端是互不影响的2个程序&#xff0c;那么我们前端应该如何从后台获取数据呢&#xff1f;因为是2个程序&#xff0c;所以必须涉及到…

【ACM】—蓝桥杯大一暑期集训Day3

&#x1f680;欢迎来到本文&#x1f680; &#x1f349;个人简介&#xff1a;陈童学哦&#xff0c;目前学习C/C、算法、Python、Java等方向&#xff0c;一个正在慢慢前行的普通人。 &#x1f3c0;系列专栏&#xff1a;陈童学的日记 &#x1f4a1;其他专栏&#xff1a;CSTL&…

langchain学习笔记(九)

RunnableBranch: Dynamically route logic based on input | &#x1f99c;️&#x1f517; Langchain 基于输入的动态路由逻辑&#xff0c;通过上一步的输出选择下一步操作&#xff0c;允许创建非确定性链。路由保证路由间的结构和连贯。 有以下两种方法执行路由 1、通过Ru…

Vue开发实例(一)Vue环境搭建第一个项目

Vue环境搭建&第一个项目 一、环境搭建二、安装Vue脚手架三、创建Vue项目 一、环境搭建 下载方式从官网下载&#xff1a;http://nodejs.cn/download/ 建议下载v12.16.0版本以上的&#xff0c;因为版本低无法创建Vue的脚手架 检验是否安装成功 配置环境变量 新增NODE_HOME&…

win11系统中nginx简单的代理配置

一.背景 为了公司安排的师带徒任务。 操作系统版本&#xff1a;win11家庭版 nginx版本&#xff1a;1.24.0 二.配置代理 之前文章已经说明了nginx简单的安装&#xff0c;要看阅读这个文章哈。web服务器nginx下载及在win11的安装-CSDN博客 1.配置需求识别 前端服务nginx(80…

【探索AI】十七 深度学习之第3周:卷积神经网络(CNN)(一)-CNN的基本原理与结构

第3周&#xff1a;卷积神经网络&#xff08;CNN&#xff09; CNN的基本原理与结构 常见的卷积层、池化层与全连接层 LeNet、AlexNet等经典CNN模型 实践&#xff1a;使用CNN进行图像分类任务 CNN的基本原理与结构 引言与背景介绍 卷积神经网络&#xff08;CNN&#xff09;是…

双周回顾#007 - 前端与后端

前端的问题不是难&#xff0c;而是它面对最终用户。只要用户的喜好和口味发生变化&#xff0c;前端就必须跟上。 这导致前端不得不快速变化&#xff0c;因为用户的口味正在越来越快地改变。 后端不需要面对最终用户&#xff0c;需要解决的都是一些经典的计算机科学问题&#…

什么是Vue指令?请列举一些常见的Vue指令以及它们的用法

Vue.js 是一款流行的前端框架&#xff0c;它的指令&#xff08;Directives&#xff09;是 Vue.js 提供的一种特殊属性&#xff0c;用于在模板中对 DOM 元素进行直接操作。指令通常是以 v- 开头的特殊属性&#xff0c;用于响应式地将数据绑定到 DOM 元素上。 在 Vue 中&#xf…

C语言初阶—函数(函数的声明和定义,函数递归)

函数声明&#xff1a; 1.告诉编译器有一个函数叫什么&#xff0c;参数是什么&#xff0c;返回类型是什么&#xff0c;但是具体是不是存在&#xff0c;函数声明决定不了。 2.函数的声明一般出现在函数使用之前&#xff0c;要满足先声明后使用。 3.函数的声明一般要放在头文件中。…

Launch学习

参考博客&#xff1a; (1) 史上最全的launch的解析来啦&#xff0c;木有之一欧 1 ROS工作空间简介 2 元功能包 src目录下可以包含多个功能包&#xff0c;假设需要使用机器人导航模块&#xff0c;但是这个模块中包含着地图、定位、路径规划等不同的功能包&#xff0c;它们的逻…

agent内存马

搭建一个简单的Servlet项目 ServletDemo package com.naihe;import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException;…

vue2+若依框架plus交互 路由介绍

本周及寒假 参加了校企合作的工程过程管理&#xff0c;和学长学姐一起写项目&#xff0c;之前学了vue也没有应用&#xff0c;然后对框架很多组件的用法不太了解&#xff0c;前期耽误了一些时间。 框架模块 首先是框架模块的介绍 api存了一些系统管理及发送请求的方法 例如p…