JNI介绍

1 JNI定义

JNI(Java Native Interface),即Java本地接口,JNI是Java调用Native 语言的一种特性。通过JNI可以使得Java与C/C++机型交互.

以下是oracle对JNI的定义
JavaTM Native Interface (JNI) is a standard programming interface for writing Java native methods and embedding the JavaTM virtual machine* into native applications. The primary goal is binary compatibility of native method libraries across all Java virtual machine implementations on a given platform.

更多oracle关于JNI的介绍可以参考 Java 原生接口规范

2 JNI介绍

Java语言的执行环境是Java虚拟机(JVM),JVM其实是主机环境中的一个进程,每个JVM虚拟机都在本地环境中有一个JavaVM结构体,该结构体在创建Java虚拟机时被返回,在JNI环境中创建JVM的函数为JNI_CreateJavaVM。

Native code通过JNI Function来访问Java VM的功能. JNI Function可以通过接口指针JNIEnv*来访问, 该指针指向一个指针数组,每个指针指向一个接口函数。 每个接口函数都在数组内的预定义偏移处。下图说明了接口指针的组织。

designa.gif

3 JavaVM 和 JNIEnv

JNI 定义了两个关键数据结构,即“JavaVM”和“JNIEnv”。两者本质上都是指向函数表的二级指针。

  • JavaVM
    理论上,每个进程可以有多个 JavaVM,但 Android 只允许有一个。JavaVM中封装的这些函数指针主要是对JVM操作接口.比较常用的是使用 AttachCurrentThread()来获取JNIEnv结构体.
    JavaVM的获取方式:
    第一种方式,在加载动态链接库的时候,JVM会调用JNI_OnLoad(JavaVM* jvm, void* reserved)(如果定义了该函数)。第一个参数会传入JavaVM指针。
    第二种方式,在native code中调用JNI_CreateJavaVM(&jvm, (void*)&env, &vm_args)可以得到JavaVM指针。
    可以用全局变量,比如JavaVM
    g_jvm来保存获得的指针以便在任意上下文中使用。
    在C和C++中的JavaVM的定义有所不同,在C中JavaVM是JNIInvokeInterface_类型指针,而在C++中有对JNIInvokeInterface_进行了一次封装

  • JNIEnv
    JNIEnv提供了大部分 JNI 函数。原生函数第一个参数就是JNIEnv 。JNIEnv是当前Java线程的执行环境,因此,无法在线程之间共享 JNIEnv。如果一段代码无法通过其他方法获取自己的 JNIEnv,应该共享相应 JavaVM,然后使用 GetEnv 发现线程的 JNIEnv(关于线程在下一篇文章里面介绍)。开发者可以通过JNIEnv调用Java函数和操作Java代码

4 jobject与jclass类型

jobject与jclass通常作为JNI函数的第二个参数,当所声明Native方法是静态方法时,对应参数类型jclass,因为静态方法不依赖对象实例,而依赖于类,所以参数中传递的是一个jclass类型。如果声明的Native方法时非静态方法时,那么对应参数是jobject。

5 JNI数据类型

基本数据类型

Java类型JNI类型描述
booleanjbooleanunsigned 8 bits
bytejbytesigned 8 bits
charjcharunsigned 16 bits
shortjshortsigned 16 bits
intjintsigned 32 bits
longjlongsigned 64 bits
floatjfloat32 bits
doublejdouble64 bits
voidvoidN/A

引用数据类型

Java类型JNI类型描述
Objectjobject任何Java对象
classjclassclass对象
Stringjstring字符串对象
Object[]jobjectArray对象数组
boolean[]jbooleanArray布尔类型数组
char[]jbyteArray字符数组
int[]jintArrayint数组
long[]jlongArraylong数组
float[]jfloatArrayfloat数组
double[]jdoubleArraydouble数组
Throwablejthrowable
types4.gif

参考
https://www.jianshu.com/p/87ce6f565d37
https://developer.android.google.cn/training/articles/perf-jni

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值