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阶段。

延伸问答

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。

🏷️

标签

➡️

继续阅读