Java本地方法/Java native方法/JNI

简介: Java本地方法/Java native方法/JNI

一、什么是JNI?



JNI是 Java Native Interface的缩写,又叫Java本地方法/Java native方法。用于Java代码和其他语言写的代码进行交互。使用java与本地已编译的代码交互,通常会丧失平台可移植性。但是,有些情况下这样做是可以接受的,甚至是必须的。例如,使用一些旧的库,与硬件、操作系统进行交互,或者为了提高程序的性能。JNI标准至少要保证本地代码能工作在任何Java 虚拟机环境。


       个人认为JNI可以理解为Java代码与已经编译好的工具库或者硬件系统的通道。当Java需要调用 C/C++或汇编语言编写的程序和库时,就要使用JNI。


       但是,由于对应于某一平台的 JNI 本地代码调用通常不能移植到其他平台上,在 applet 中使用还可能引发安全异常。因此,从跨平台性考虑,在系统实现中一般要求尽可能少使用本地代码。如果必须要使用,要使本地方法尽量简单,独立。


       需要注意的是,不是本地方法不是Java独有,很多编程语言也有本地方法。


二、如何使用

       在Java中使用本地方法,用native来修饰,并且不能实现。具体例子,可以参考:JNI_百度百科



三、native方法与Java虚拟机

       我们知道,JVM在执行Java程序时,会把它所管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁(来自《深入理解Java虚拟机》)。


image.png


虚拟机栈为虚拟机执行Java方法(也就是字节码)服务;本地方法栈为虚拟机使用的native方法服务。甚至有的虚拟机(譬如Sun HotSpot虚拟机)直接就把本地方法栈和虚拟机栈合二为一,即在调用普通方法时,创建java虚拟机栈帧,并压入栈中。当下个方法执行本地方法时,将切换到 本地方法栈,进行调用,运行在一起。虚拟机会保持 Java 栈不变,不再在线程的 Java 栈中压入新的帧,只是简单地动态连接并直接调用指定的本地方法。


       本地方法栈也是线程私有,与虚拟机栈一样,本地方法栈区域也会抛出StackOverflowError和OutOfMemoryError异常。(部分内容来自《深入理解Java虚拟机》)。


       但并不是所有的JVM都支持本地方法。因为Java虚拟机规范并没有明确要求本地方法栈的使用语言、具体实现方式、数据结构等。如果JVM产品不打算支持native方法,也可以无需实现本地方法栈。


四、总结

       JNI主要用于Java调用非Java语言的方法,或者调用操作系统或硬件的方法。在Java中使用时,用native修饰符修饰。在Java虚拟机管理的内存中,由本地方法栈为JNI服务,有些虚拟机直接将虚拟机栈和本地方法栈合二为一,不是所有的虚拟机都支持本地方法。


相关文章
|
25天前
|
监控 Java API
提升 Java 后台性能的十大方法
【4月更文挑战第5天】本文介绍了提升 Java 后台性能的十大方法,包括 JVM 参数调整、代码优化、并发编程、数据库性能优化、I/O 优化、微服务架构、API 设计、负载均衡、容器化和编排以及性能监控。通过这些方法,可以从代码到系统层面全面提升 Java 应用的效率和响应性。注意早期设计对性能的影响,持续优化是关键。
|
20天前
|
Java
Java中ReentrantLock中tryLock()方法加锁分析
Java中ReentrantLock中tryLock()方法加锁分析
13 0
|
9天前
|
Java 关系型数据库 MySQL
Elasticsearch【问题记录 01】启动服务&停止服务的2类方法【及 java.nio.file.AccessDeniedException: xx/pid 问题解决】(含shell脚本文件)
【4月更文挑战第12天】Elasticsearch【问题记录 01】启动服务&停止服务的2类方法【及 java.nio.file.AccessDeniedException: xx/pid 问题解决】(含shell脚本文件)
46 3
|
1天前
|
IDE Java 开发工具
基于Java程序设计的实验教学方法优化与实践
基于Java程序设计的实验教学方法优化与实践
7 1
|
3天前
|
存储 Java 索引
【JAVA】HashMap的put()方法执行流程
【JAVA】HashMap的put()方法执行流程
|
6天前
|
Java
Java 与垃圾回收有关的方法
Java 与垃圾回收有关的方法
|
6天前
|
存储 Java 测试技术
一文搞清楚Java中的方法、常量、变量、参数
在JVM的运转中,承载的是数据,而数据的一种变现形式就是“量”,量分为:**常量与变量**,我们在数学和物理学中已经接触过变量的概念了,在Java中的变量就是在程序运行过程中可以改变其值的量。
14 0
|
11天前
|
存储 Java
Java动态转发代理IP的实现方法
Java动态转发代理IP的实现方法
28 11
|
12天前
|
Java
Java接口中可以定义哪些方法?
【4月更文挑战第13天】
14 0
Java接口中可以定义哪些方法?
|
18天前
|
Java
优化字符串处理:探索Java 21中StringBuilder和StringBuffer的全新repeat方法
优化字符串处理:探索Java 21中StringBuilder和StringBuffer的全新repeat方法
11 0