native 关键字在 JDK 源码中很多类中都有,在 Object.java类中,其 getClass() ⽅法、hashCode()
⽅法、clone() ⽅法等等都是⽤ native 关键字修饰的。

public final native Class<?> getClass();
public native int hashCode();
protected native Object clone() throws CloneNotSupportedException;

为什么要⽤ native 来修饰⽅法,这样做有什么⽤?

1、JNI:Java Native Interface

⼀般情况下,我们完全可以使⽤ Java 语⾔编写程序,但某些情况下,Java 可能会不满⾜应⽤程序的需求,或者是不能更好的满⾜需求,⽐如:

①、标准的 Java 类库不⽀持应⽤程序平台所需的平台相关功能。
②、我们已经⽤另⼀种语⾔编写了⼀个类库,如何⽤Java代码调⽤?
③、某些运⾏次数特别多的⽅法代码,为了加快性能,我们需要⽤更接近硬件的语⾔(⽐如汇编)编写。

  上⾯这三种需求,其实说到底就是如何⽤ Java 代码调⽤不同语⾔编写的代码。那么 JNI 应运⽽⽣了。

  从Java 1.1开始,Java Native Interface (JNI)标准就成为java平台的⼀部分,它允许Java代码和其他语⾔写的代码进⾏交互。JNI⼀开始是为了本地已编译语⾔,尤其是C和C++⽽设计 的,但是它并不妨碍你使⽤其他语⾔,只要调⽤约定受⽀持就可以了。使⽤java与本地已编译的代码交互,通常会丧失平台可移植性。但是,有些情况下这样做是可以接受的,甚⾄是必须的,⽐如,使⽤⼀些旧的库,与硬件、操作系统进⾏交互,或者为了提⾼程序的性能。JNI标准⾄少保证本地代码能⼯作在任何Java 虚拟机实现下.
file
JNI 的缺点:

  ①、程序不再跨平台。要想跨平台,必须在不同的系统环境下重新编译本地语⾔部分。
  ②、程序不再是绝对安全的,本地代码的不当使⽤可能导致整个程序崩溃。⼀个通⽤规则是,你应该让本地⽅法集中在少数⼏个类当中。这样就降低了JAVA和C之间的耦合性。

2、JNI调⽤C的流程图

file

3.native关键字

native ⽤来修饰⽅法,⽤ native 声明的⽅法表示告知 JVM 调⽤,该⽅法在外部定义,我们可以⽤任何语⾔去实现它。 简单地讲,⼀个native Method就是⼀个 Java 调⽤⾮ Java 代码的接⼝。

native 语法:

①、修饰⽅法的位置必须在返回类型之前,和其余的⽅法控制符前后关系不受限制。
②、不能⽤ abstract 修饰,也没有⽅法体,也没有左右⼤括号。
③、返回值可以是任意类型

链接:Java关键字解析

最后修改日期: 2022年2月23日