JNI 基础知识

JNI(Java Native Interface)允许Java代码与其他编程语言(如C和C++)交互,提升性能并利用丰富的Native库。本文介绍了JNI的基础知识,包括JNI数据类型与Java、C++的对比,Java其他数据类型的JNI映射,JNI对象的方法,域描述符以及如何检查JNI内存泄漏,帮助开发者更好地理解和使用JNI。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JNI 基础知识

什么是 JNI ?

JNI (Java Native Interface) 是 Java 沟通 Native 语言(主要是C、C++)的桥梁。
Native 语言有着更高的性能,更重要的是还有庞大的 Native 语言所编写的库。
这些给 Java 语言提供很多性能优秀的强大功能支持。
JNI 能够提供 Java 更快速的 Native 功能移植,也能利用 C++ 的反汇编能力加强代码安全性。

JNI 数据类型与 Java 、C++ 类型对比

Java 使用 JNI 最主要连接的 Native 语言是 C、C++(C++可以兼容C)。
因此这里介绍 Java 类型与 JNI 类型和 C++ 类型的对比关系。

Java 类型 JNI 类型 C++ 类型(包含封装的部分)
intjint / jsizelong
longjlong__int64
bytejbytesigned char
booleanjbooleanunsigned char
charjcharunsigned short
shortjshortshort
floatjfloatfloat
doublejdoubledouble
Objectjobject_jobject*

Java 其它数据类型与 JNI 的关系

Java 还具有其它基础类型,为了方便调用也需要有 JNI 的类型进行对应。
基于常用的类型,有以下关系。
所有的 Class 都继承于 jobject,但是由于层次不一样。
不同的 jobject 的子类型有着不同的获取、调用和释放方式。

jobject继承

JNI 各种对象的方法

方法说明
FindClass加载本地定义的类
GetObjectClass通过对象获取这个类
NewObject创建 jobject 类型的对象
NewString创建 jstring 类型的对象
DeleteLocalRef删除局部引用
DeleteGlobalRef删除全局引用
New<Type>Array创建类型为 Type 的数组对象
Get<Type>ArrayElements从类型为 Type 的数组对象获取类型为 Type 的数组指针
Release<Type>ArrayElements根据类型为 Type 的数组对象释放类型为 Type 的数组指针指向的资源
Get<Type>Field获取类型为 Type 的字段
GetStatic<Type>Field获取类型为 Type 的 static 字段
Set<Type>Field设置类型为 Type 的字段
SetStatic<Type>Field设置类型为 Type 的 static 字段
Call<Type>Method调用类型为 Type 的方法
CallStatic<Type>Method调用类型为 Type 的 static 方法

还有很多与类有关的方法,利用的频率不高就先不添加了。

JNI 域描述符

Java 类型 JNI 类型域描述符说明示例
booleanjbooleanZ
bytejbyteB
charjcharC
shortjshortS
intjintI
longjlongJ
floatjfloatF
doublejdoubleD
int[][I 一维数组形式,以一个 “[” 表示一维数组
byte[][][[BN 维数组则以 N 个 “[” 表示 N 维
StringjstringLjava/lang/String; 类参数,则以 “Lxxx/yyy;” 的形式表示,注意 “L” 开头和 “;” 结尾。xxx/yyy 则是类的路径(都属于 jobject )
返回值 voidV
函数形式 (xxx)yyy"()" 内为输入参数,右侧为输出参数

JNI 内存泄漏检查

由于 JNI 的机制,凡是创建 jobject 对象(包括其派生),都会在 Heap 申请资源。
及时不使用 jobject 对象,也会有资源占用。
导致退出时需要对 JNI 内的 jobject 对象资源释放。
(如果 jobject 返回到 Java 接口中,由 Java 进行回收)

对于新手的 JNI 开发来说,内存泄漏可能是必然存在的情况。
检查内存泄漏可以使用如下 adb 命令:


adb shell dumpsys meminfo packageName

检查 Native Heap 项,如下图。
adb检查Native Heap

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值