文章目录
- 前言
- [一、native 应用场景](#一、native 应用场景)
- [二、native 方法的工作原理](#二、native 方法的工作原理)
前言
在阅读 JDK 源码时,我们经常会看到一类特殊的方法,它们只有方法声明,没有方法体,并且用 native 关键字修饰:
java
// Thread.java 中的 native 方法
public static native void yield();
// Object.java 中的 native 方法
public final native void notify();
// System.java 中的 native 方法
public static native void arraycopy(Object src, int srcPos, Object dest, int destPos, int length);
native 方法是 Java 调用非 Java 代码的接口。 它的方法体不是用 Java 语言编写的,而是用 C / C++ 等本地语言实现,并编译成特定平台相关的动态链接库(如 Windows 下的 .dll、Linux 下的 .so)。
这种机制被称为 JNI(Java Native Interface,Java 本地接口)。
一、native 应用场景
Java 是一门运行在 JVM 之上的高级语言,其"一次编写,到处运行"的特性建立在屏蔽底层硬件与操作系统差异的基础上。但这也带来了一个限制:Java 无法直接操作硬件或调用操作系统内核的功能。而 native 方法正是为了打破这个限制而存在的,主要有以下应用场景:
1.调用操作系统底层 API
Java 的线程调度、文件 I/O、网络通信等,最终都依赖于操作系统的系统调用。这些功能必须通过 native 方法来"穿透"JVM,直接请求操作系统内核。
java
// Thread.start() 最终会调用 native 的 start0() 方法
private native void start0();
start0() 内部会调用 Linux 的 pthread_create 或 Windows 的 CreateThread 来创建真正的内核线程。
2.与硬件交互
例如需要读取 CPU 序列号、直接操作显卡内存、获取物理内存大小等。Java 层面无法做到,必须通过 native 方法调用 C 语言编写的驱动程序接口。
3.复用已有的 C / C++ 代码库
企业中有大量经过长期验证的 C/C++ 遗留系统(如加解密算法、图像处理、科学计算库)。通过 JNI 可以将这些成熟的库直接引入 Java 项目,避免重复造轮子。
4.追求极致性能
虽然 JIT 技术让 Java 的执行速度越来越快,但在某些极端场景下(如大量数学运算、内存拷贝),手动优化的 C 代码仍然比 Java 更快。System.arraycopy() 就是一个典型例子------它直接用 C 语言的 memmove 实现内存块的快速复制。
二、native 方法的工作原理

- 声明 native 方法:在 Java 类中使用 native 关键字声明方法,不提供方法体。
- 生成 JIN 头文件:使用 javac -h 命令编译 Java 类,生成 C/C++ 头文件(.h),其中包含 native 方法的函数原型。
- 实现 C/C++ 代码:在 .c 或 .cpp 文件中实现头文件中声明的函数,编写具体的本地逻辑。
- 编译为动态库:将 C/C++ 代码编译为平台相关的动态链接库(.dll 或 .so)。
- 加载本地库:在 Java 代码中使用 System.loadLibrary() 加载动态库。
- 调用执行:Java 调用 native 方法时,JVM 根据映射关系找到对应的 C 函数并执行。