百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

第三章: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正式版发布:古墓丽影&amp;巫师新作采用、新一代实时渲染

机器之心报道编辑:杜伟、陈萍虚幻引擎5的目标是「助力各种规模的团队在视觉领域和互动领域挑战极限,施展无限潜能」。...

AMD Milan-X双路霄龙7773X平台基准测试曝光 CPU缓存总量超1.5GB

OpenBenchmarking基准测试数据库刚刚曝光了AMDMilan-X双路霄龙7773X平台的跑分成绩,虽然很快就被撤下,但我们还是知晓了高达1.6GB的总CPU缓存。早些时...

ROS机器人建模_ros机器人硬件搭建

...

全网最新的Dify(1.7.2)私有化离线部署教程(ARM架构)

Hello,大家好!近期工作中有涉及到Dify私有化离线部署,特别是针对于一些国产设备。因此特别整理了该教程,实测有效!有需要的小伙伴可以参考下!本文主要针对Dify1.7.2最新版本+国产操作系...

在ubuntu下新建asp.net core项目_创建ubuntu

本文一步步讲述在ubuntu下用visualstudiocode创建asp.netcore项目的过程。step1:环境操作系统:virtualbox下安装的lubuntu。请不要开启“硬件...

在晶晨A311D2处理器上进行Linux硬件视频编码
在晶晨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主题。而现在,这款将于年底之前上线的操作...