第三章:JNI类型和数据结构_数据结构cin是什么
haoteby 2025-08-26 17:21 4 浏览
本章讨论了JNI如何将Java类型映射到本机C类型。
本章涵盖以下主题:
- 基本类型
- 引用类型
- 字段和方法ID
- 值类型
- 类型签名
- 修改过的UTF-8字符串
原始类型
下表描述了Java原始类型及其机器相关的native等效类型。
原始类型和native等效类型
Java类型 | native类型 | 描述 |
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 | 不适用 |
为了方便起见,提供以下定义。
#define JNI_FALSE 0
#define JNI_TRUE 1
jsize是用于描述基数索引和大小的整数类型:
typedef jint jsize;
引用类型
JNI 包括多个引用类型,对应不同种类的 Java 对象。JNI 引用类型按以下层次结构组织:
- jobject
jclass(java.lang.Class 对象)
jstring(java.lang.String 对象)
jarray(数组)
jobjectArray(对象数组)
jbooleanArray(布尔数组)
jbyteArray(字节数组)
jcharArray(字符数组)
jshortArray(短整型数组)
jintArray(整型数组)
jlongArray(长整型数组)
jfloatArray(浮点型数组)
jdoubleArray(双精度浮点型数组)
jthrowable(java.lang.Throwable 对象)
在 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 VM 的类型签名表示。下表显示了这些类型签名。
Java VM 类型签名
类型签名 | Java 类型 |
Z | boolean |
B | byte |
C | char |
S | short |
I | int |
J | long |
F | float |
D | double |
L fully-qualified-class ; | fully-qualified-class |
[ type | type[] |
( arg-types ) ret-type | method type |
例如,Java 方法:
long f (int n, String s, int[] arr);
具有以下类型签名:
(ILjava/lang/String;[I)J
修改 UTF-8 字符串
JNI使用修改过的UTF-8字符串来表示各种字符串类型。修改过的UTF-8字符串与Java VM使用的相同。修改过的UTF-8字符串被编码,以便只包含非空ASCII字符的字符序列可以使用每个字符只占用一个字节来表示,但是所有Unicode字符都可以表示。
范围在 \u0001 到 \u007F 内的所有字符用一个字节表示,如下所示:
- 0xxxxxxx
字节中的七个数据位给出所表示字符的值。
空字符('\u0000')和范围在'\u0080'到'\u07FF'内的字符用一对字节 x 和 y 表示:
- x: 110xxxxx
- y: 10yyyyyy
字节表示具有值 ((x & 0x1f) << 6) + (y & 0x3f) 的字符。
范围在'\u0800'到'\uFFFF'内的字符用 3 个字节 x,y 和 z 表示:
- x: 1110xxxx
- y: 10yyyyyy
- z: 10zzzzzz
用字节表示具有值 ((x & 0xf) << 12) + ((y & 0x3f) << 6) + (z & 0x3f) 的字符。
代码点高于 U+FFFF(所谓的补充字符)的字符是通过单独编码其 UTF-16 表示中的两个代理代码单元来表示的。每个代理代码单元由三个字节表示。这意味着,补充字符由六个字节 u,v,w,x,y 和 z 表示:
- u: 11101101
- v: 1010vvvv
- w: 10wwwwww
- x: 11101101
- y: 1011yyyy
- z: 10zzzzzz
用六个字节表示具有值0x10000+((v&0x0f)<<16)+((w&0x3f)<<10)+(y&0x0f)<<6)+(z&0x3f)的字符。
多字节字符的字节以大端(高字节优先)的顺序存储在类文件中。
此格式与标准UTF-8格式之间有两个区别。首先,使用两个字节格式而不是一个字节格式来编码空字符(char)0。这意味着修改过的UTF-8字符串从不包含嵌入的null。其次,仅使用标准UTF-8的一字节、两字节和三字节格式。Java VM不识别标准UTF-8的四字节格式;它使用其自己的两倍三字节格式。有关标准UTF-8格式的更多信息,请参阅Unicode标准第4.0版的第3.9节“Unicode编码表单”。
本文原文地址:
https://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/types.html
相关推荐
- Chrome OS 41 用 Freon 取代 X11_chrome os atom
-
在刚发布的ChromeOS41里,除了常规的Wi-Fi稳定性提升(几乎所有系统的changelog里都会包含这一项)、访客模式壁纸等之外,还存在底层改变。这一更新中Google移除...
- 苹果iPad Pro再曝光 有望今年六月发布
-
自进入2015年以后,有关大屏iPad的消息便一直不绝于耳,之前就有不少媒体猜想这款全新的平板电脑将会在三月发布,不过可惜的是我么只在那次发布会上看到了MacBookPro。近日@Ubuntu团队便...
- 雷卯针对香橙派Orange Pi 5 Max开发板防雷防静电方案
-
一、应用场景高端平板、边缘计算、人工智能、云计算、AR/VR、智能安防、智能家居、Linux桌面计算机、Linux网络服务器、Android平板、Android游戏机...
- Ubuntu Server无法更新问题解决_ubuntu server not found
-
上周老家的一台运行UbuntuServer的盒子无法连接上了,中秋这两天回来打开,顺手更新一下发现更新报错。提示`E:Releasefileforhttps://mirrors.aliyun...
- 虚幻引擎5正式版发布:古墓丽影&巫师新作采用、新一代实时渲染
-
机器之心报道编辑:杜伟、陈萍虚幻引擎5的目标是「助力各种规模的团队在视觉领域和互动领域挑战极限,施展无限潜能」。...
- AMD Milan-X双路霄龙7773X平台基准测试曝光 CPU缓存总量超1.5GB
-
OpenBenchmarking基准测试数据库刚刚曝光了AMDMilan-X双路霄龙7773X平台的跑分成绩,虽然很快就被撤下,但我们还是知晓了高达1.6GB的总CPU缓存。早些时...
- 全网最新的Dify(1.7.2)私有化离线部署教程(ARM架构)
-
Hello,大家好!近期工作中有涉及到Dify私有化离线部署,特别是针对于一些国产设备。因此特别整理了该教程,实测有效!有需要的小伙伴可以参考下!本文主要针对Dify1.7.2最新版本+国产操作系...
- 在ubuntu下新建asp.net core项目_创建ubuntu
-
本文一步步讲述在ubuntu下用visualstudiocode创建asp.netcore项目的过程。step1:环境操作系统:virtualbox下安装的lubuntu。请不要开启“硬件...
-
- 在晶晨A311D2处理器上进行Linux硬件视频编码
-
在KhadasVIM4AmogicA311D2SBC上,我更多的时间是在使用Ubuntu22.04。它的总体性能还不错,只不过缺少3D图形加速和硬件视...
-
2025-08-26 17:22 haoteby
- Nacos3.0重磅来袭!全面拥抱AI,单机及集群模式安装详细教程!
-
之前和大家分享过JDK17的多版本管理及详细安装过程,然后在项目升级完jdk17后又发现之前的注册和配置中心nacos又用不了,原因是之前的nacos1.3版本的,版本太老了,已经无法适配当前新的JD...
- 电影质量级渲染来了!虚幻引擎5.3正式发布:已开放下载
-
快科技9月8日消息,日前,Unrealengine正式发布了虚幻引擎5.3,带来了大量全方位的改进。...
- 2025如何选购办公电脑?极摩客mini主机英特尔系列选购指南
-
当下,迷你主机的性能越来越强,品类也越来越多。但是CPU是不变的,基本都是AMD和英特尔的。有一个小伙伴在评论区提问,我应该如何在众多机器中选购一台符合自己的迷你主机呢?那今天我们优先把我们的系列,分...
- ubuntu 20.04+RTX4060 Ti+CUDA 11.7+cudnn
-
ububtu添加国内源sudocp/etc/apt/sources.list/etc/apt/sources.list.backupsudovim/etc/apt/sources.lis...
- Linux Mint 18将重新基于Ubuntu 16.04 带来更好硬件支持
-
项目负责人ClementLefebvre在本月6日披露了关于LinuxMint18“Sarah”操作系统的大量信息,包括带来全新扁平化体验的Mint-Y主题。而现在,这款将于年底之前上线的操作...