【JAVA基础面经】native方法

文章目录

  • 前言
  • [一、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 方法的工作原理

  1. 声明 native 方法:在 Java 类中使用 native 关键字声明方法,不提供方法体。
  2. 生成 JIN 头文件:使用 javac -h 命令编译 Java 类,生成 C/C++ 头文件(.h),其中包含 native 方法的函数原型。
  3. 实现 C/C++ 代码:在 .c 或 .cpp 文件中实现头文件中声明的函数,编写具体的本地逻辑。
  4. 编译为动态库:将 C/C++ 代码编译为平台相关的动态链接库(.dll 或 .so)。
  5. 加载本地库:在 Java 代码中使用 System.loadLibrary() 加载动态库。
  6. 调用执行:Java 调用 native 方法时,JVM 根据映射关系找到对应的 C 函数并执行。
相关推荐
牛十二2 小时前
nacos2.4连接出错源码分析
java·linux·开发语言
阿巴斯甜2 小时前
userList.stream().sorted((u1, u2) -> u2.getAge() - u1.getAge()); 怎么判断是升序还是降序?
java
小松加哲2 小时前
AspectJ编译期织入实战
java·开发语言
鲸渔2 小时前
【C++ 跳转语句】break、continue、goto 与 return
开发语言·c++·算法
贺小涛2 小时前
python和golang进程、线程、协程区别
java·python·golang
Seven972 小时前
Tomcat的架构设计和启动过程详解
java
Mr-Wanter2 小时前
踩坑记录:IDEA 启动服务连续三次 OOM 内存溢出完整解决
java·ide·intellij-idea·oom
阿巴斯甜2 小时前
User::getName含义?
java
喜欢吃燃面2 小时前
Linux 进程信号深度解析:从概念到产生机制
linux·开发语言·学习