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服务,有些虚拟机直接将虚拟机栈和本地方法栈合二为一,不是所有的虚拟机都支持本地方法。


相关文章
|
2天前
|
Java 关系型数据库 MySQL
Elasticsearch【问题记录 01】启动服务&停止服务的2类方法【及 java.nio.file.AccessDeniedException: xx/pid 问题解决】(含shell脚本文件)
【4月更文挑战第12天】Elasticsearch【问题记录 01】启动服务&停止服务的2类方法【及 java.nio.file.AccessDeniedException: xx/pid 问题解决】(含shell脚本文件)
59 3
|
2天前
|
Java
判断不为空和不为空串的方法java
判断不为空和不为空串的方法java
|
2天前
|
Java
【专栏】Java反射机制,该机制允许程序在运行时获取类信息、动态创建对象、调用方法和访问属性
【4月更文挑战第27天】本文探讨了Java反射机制,该机制允许程序在运行时获取类信息、动态创建对象、调用方法和访问属性。反射通过Class、Constructor、Method和Field类实现。文中列举了反射的应用场景,如动态创建对象、调用方法、访问属性和处理注解,并提供了相关实例代码演示。
|
1天前
|
Java
Java String 避免空指针的方法
Java String 避免空指针的方法
4 0
|
2天前
|
Java
【Java开发指南 | 第九篇】访问实例变量和方法、继承、接口
【Java开发指南 | 第九篇】访问实例变量和方法、继承、接口
14 4
|
2天前
|
XML JavaScript Java
详解Java解析XML的四种方法
详解Java解析XML的四种方法
15 1
|
2天前
|
存储 Java API
掌握8条方法设计规则,设计优雅健壮的Java方法
掌握8条方法设计规则,设计优雅健壮的Java方法
|
2天前
|
Java C语言
详解java方法与递归
详解java方法与递归
11 3
|
2天前
|
SQL Java 数据库连接
JDBC Java标准库提供的一些api(类+方法) 统一各种数据库提供的api
JDBC Java标准库提供的一些api(类+方法) 统一各种数据库提供的api
11 0
|
2天前
|
Java
Java一分钟之-方法定义与调用基础
【5月更文挑战第8天】本文介绍了Java编程中的方法定义和调用,包括基本结构、常见问题和避免策略。方法定义涉及返回类型、参数列表和方法体,易错点有返回类型不匹配、参数错误和忘记返回值。在方法调用时,要注意参数传递、静态与非静态方法的区分,以及重载方法的调用。避免错误的策略包括明确返回类型、参数校验、理解值传递、区分静态和非静态方法以及合理利用重载。通过学习和实践,可以提升编写清晰、可维护代码的能力。
14 0