Android jni原理
一、JNI的作用
从 JVM 角度,存在两种类型的代码:“Java”和“native”, native 一般指的是 c/c++,为了使 java 和 native 端能够进行交互,java 设计了 JNI(java native interface)。
JNI 允许java虚拟机(VM)内运行的java代码与C++、C++和汇编等其他编程语言编写的应用程序和库进行互操作。
二、JNI中的重要的类
1、JNIEnv
JNIEnv类型实际上代表了Java环境,通过这个 JNIEnv* 指针,就可以对 Java 端的代码进行操作:
- 调用 Java 函数
- 操作 Java 对象
NIEnv 的本质是一个与线程相关的结构体,里面存放了大量的 JNI 函数指针:
struct _JNIEnv {
/** * 定义了很多的函数指针 **/
const struct JNINativeInterface* functions;
#if defined(__cplusplus)
/// 通过类的名称(类的全名,这时候包名不是用.号,而是用/来区分的)来获取jclass
jclass FindClass(const char* name)
{ return functions->FindClass(this, name); }
...
}
JNIEnv 的结构图如下:
2、JavaVM
JavaVM : JavaVM 是 Java虚拟机在 JNI 层的代表, JNI 全局只有一个
JNIEnv : JavaVM 在线程中的代表, 每个线程都有一个, JNI 中可能有很多个 JNIEnv,同时 JNIEnv 具有线程相关性,也就是 B 线程无法使用 A 线程的 JNIEnv
JVM 的结构图如下:
三、JNI有如下两种注册native方法的途径:
1、静态注册:
先由Java得到本地方法的声明,然后再通过JNI实现该声明方法
2、动态注册:
先通过JNI重载JNI_OnLoad()实现本地方法,然后直接在Java中调用本地方法。
三、总结
jni的本质是通过一种协议来定义两种语言的通信机制,并且在c++中封装了一个jvm,然后通过反射的机制来执行java中的对象。
还没有评论,来说两句吧...