JNI的源码实现分析
💡
原文中文,约38500字,阅读约需92分钟。
📝
内容提要
在本文中,作者详细介绍了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阶段。
🏷️
标签
➡️