JDK,JRE与JVM详解以及JNI是什么?

一.JVM,JRE与JDK的关系

1.JVM

🌟JVMJava虚拟机(Java Virtual Machine 简称JVM)用来解释.class文件

    Java虚拟机解释编译后的class文件给系统。.java代码编译成 .class机器指令,就能在JVM运行了,直接到硬件执行,实现了跨平台,只要操作系统安装了JVM,就能执行,这样CS程序与具体的操作系统无关。BS系统只要浏览器中有JVM即可执行。

2.JRE

🌟JRE(java runtime environment,Java运行环境),也被称为Private Runtime,包含了用于产品环境的各种类库,以及给开发人员使用的补充库,如国际化的库、IDL库。

JRE运行java程序,包含JVM和java程序调用的java类库,一次编写到处运行,就是因为使用了JRE这个java程序和操作系统的中介。也叫java插件。

3.JDK

🌸JDK是 java 语言的软件开发工具包,用来开发java程序,但eclipse和IDEA等编译器,只用JDK的jre包

   现在我们可以看出这样一个关系,JDK包含JRE,而JRE包 含JVM

以JDK17为例,下图展示了其中主要文件的作用。

二.JNI是什么?

首先,我们打开JDK17,发现有一个文件jni.h,在include文件夹中。那么这个文件是做什么的呢?

以.h为后缀的文件一般都和c/c++有关,我们猜,它和C/C++文件有关。

JNI定义

JNI是Java Native Interface的缩写,通过使用 Java本地接口书写程序,可以确保代码在不同的平台上方便移植。 从Java1.1开始,JNI标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他编程语言,只要调用约定受支持就可以了。使用java与本地已编译的代码交互,通常会丧失平台可移植性。但是,有些情况下这样做是可以接受的,甚至是必须的。例如,使用一些旧的库,与硬件、操作系统进行交互,或者为了提高程序的性能。JNI标准至少要保证本地代码一般是C/C++)能工作在任何Java 虚拟机环境。

JNI的作用

原来,JNI是为了调用操作系统而设置的。

以windows操作系统为例来介绍JNI

其实,java语言本身是不能控制操作系统的,Windows操作系统是由C语言控制的,我们要创建线程,进行读写磁盘,内存的操作,这些都是需要操作系统参与的,所以,我们要让java调用C代码,来实现对操作系统的控制,怎么实现哩?

由JNI来实现。简单来说JNI就是实现C与java通信的。

本地代码与 Java 虚拟机之间是通过 JNI 函数实现相互操作的。JNI 函数通过接口指针来获得,本地方法将 JNI 接口指针当作参数来接受。虚拟机保证在从相同的 Java 线程中对本地方法进行多次调用时,传递给本地方法的接口指针是相同的,本地方法被不同的 Java 线程调用时,它接受不同的 JNI接口指针

JNI的使用流程图如下:

简单来说,分为以下几步:

1.编写带有native声明的方法的java类

2.使用javac命令编译所编写的java类:.java->.class

3.然后使用javah + java类名生成扩展名为h的头文件

4.使用C/C++实现本地方法

5.将C/C++编写的文件生成动态连接库

 🌺推荐文章:jni使用

java和C/C++通信是通过jni来完成的,那么在jni方法中就涉及到对java变量的访问(变量类型包括基本数据类型和引用数据类型),对java方法的调用,java对象的创建等,而java语法跟jni语法不一定是一 一对应的,比如,java中叫boolean,jni中叫jboolean,那怎么解决这个问题呢,jni给我们提供了若干个映射表,将java中的类型与jni中的类型进行了一 一映射,其中包括基本数据类型映射,引用数据类型映射,方法签名(包含参数和返回值)映射

以下是一些java类型和jni的映射关系

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值