Android jni原理

向右看齐 2022-12-02 15:17 336阅读 0赞

一、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 函数指针:

  1. struct _JNIEnv {
  2. /** * 定义了很多的函数指针 **/
  3. const struct JNINativeInterface* functions;
  4. #if defined(__cplusplus)
  5. /// 通过类的名称(类的全名,这时候包名不是用.号,而是用/来区分的)来获取jclass
  6. jclass FindClass(const char* name)
  7. { return functions->FindClass(this, name); }
  8. ...
  9. }

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中的对象。

发表评论

表情:
评论列表 (有 0 条评论,336人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Android jni原理

    一、JNI的作用 从 JVM 角度,存在两种类型的代码:“Java”和“native”, native 一般指的是 c/c++,为了使 java 和 native 端能够

    相关 Android JNI

    ![20210320191621381.png][] 在Android OS上开发应用程序,Google提供了两种开发包:SDK和NDK。Android 平台从一开就已经支持

    相关 android JNI

    Java Native Interface (JNI)标准是java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI 是本地编程接口,它使得在 Java 虚拟

    相关 android JNI 开发

    好记性不如烂笔头,开始坚持写博客,学一点记一点,只为了生活更好。 学了一年多的硬件,现在来做android,不知道是对是错,跟着感觉走,开始总是想把android和硬件挂上勾