JNI的源码实现分析
内容提要
在本文中,作者详细介绍了JNI的实现过程。首先,作者解释了在系统启动过程中,JNI的构建阶段,包括加载核心库、创建虚拟机对象和注册JNI函数。然后,作者讲解了在Java调用JNI函数时的运行时阶段,包括解析native方法、链接到汇编代码和调用注册的JNI函数。最后,作者介绍了在JNI调用Java函数时的过程,包括加载so库、调用JNI_OnLoad函数和通过函数信息调用Java函数。
关键要点
-
JNI是Java与C++之间的接口,主要用于实现两者的沟通。
-
JNI的关键类型包括JavaVM、JNIEnv、jclass、jmethodID和jfieldID。
-
在Android中,JNI的接口声明在libnativehelper.so动态库中,相关源码在jni.h中。
-
Java与C++的初次联系发生在Android开机启动过程中,创建JVM虚拟机和JNI环境。
-
zygote进程的入口函数负责初始化AppRuntime,加载本地库并创建虚拟机。
-
AndroidRuntime的start方法主要完成加载本地库、创建虚拟机和注册Java native方法。
-
虚拟机创建后,JNI方法的动态注册为Java代码的运行提供了基础环境。
-
Java层通过类的全路径名找到对应的类,并调用其静态方法进入Java层。
-
JNI的注册接口RegisterNatives用于建立C++函数与Java方法的映射关系。
-
Java调用native方法时,虚拟机会解析类的结构并为native函数指定调用的函数。
-
C++调用Java方法时,通过JNIEnv找到对应的Java类和方法ID,然后调用。
-
JNI的实现过程分为三个阶段:构建阶段、运行时Java调用JNI阶段和JNI调用Java阶段。
延伸问答
JNI的主要功能是什么?
JNI是Java与C++之间的接口,主要用于实现两者的沟通。
JNI的实现过程分为哪几个阶段?
JNI的实现过程分为构建阶段、运行时Java调用JNI阶段和JNI调用Java阶段。
在Android中,JNI的接口声明在哪里?
在Android中,JNI的接口声明在libnativehelper.so动态库中,相关源码在jni.h中。
如何在Java中调用native方法?
在Java中调用native方法时,首先需要加载对应的so库,然后通过JNI提供的接口调用相应的native方法。
JNI中如何建立C++函数与Java方法的映射关系?
通过JNI的注册接口RegisterNatives来建立C++函数与Java方法的映射关系。
JNI的关键类型有哪些?
JNI的关键类型包括JavaVM、JNIEnv、jclass、jmethodID和jfieldID。