使用FFMpeg 模仿Android MediaPlayer

JNI介绍

2020-07-21  本文已影响0人  llm_5243

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”。两者本质上都是指向函数表的二级指针。

4 jobject与jclass类型

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

5 JNI数据类型

基本数据类型

Java类型 JNI类型 描述
boolean jboolean unsigned 8 bits
byte jbyte signed 8 bits
char jchar unsigned 16 bits
short jshort signed 16 bits
int jint signed 32 bits
long jlong signed 64 bits
float jfloat 32 bits
double jdouble 64 bits
void void N/A

引用数据类型

Java类型 JNI类型 描述
Object jobject 任何Java对象
class jclass class对象
String jstring 字符串对象
Object[] jobjectArray 对象数组
boolean[] jbooleanArray 布尔类型数组
char[] jbyteArray 字符数组
int[] jintArray int数组
long[] jlongArray long数组
float[] jfloatArray float数组
double[] jdoubleArray double数组
Throwable jthrowable
types4.gif

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

上一篇 下一篇

猜你喜欢

热点阅读