【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 函数并执行。
相关推荐
盛世宏博智慧档案1 分钟前
恒湿净化一体机联动开发:档案馆温湿度阈值判断与启停控制实践
java·后端·struts·恒湿机·加湿除湿消毒净化一体机
奇树谦3 分钟前
LRU 缓存原理与 C++ 实践示例
开发语言·c++·缓存
toooooop85 分钟前
FastAdmin Hook 机制与插件错误透传:`$result` 之外的信封
开发语言·fastadmin
huaweichenai19 分钟前
spring boot实现base64上传
java·spring boot·后端
萧瑟余晖24 分钟前
Spring Web综合实战与性能调优详解
java·spring
点纭25 分钟前
spring ai1.0实战:ChatClient(2)
java·后端·spring
小马过河R29 分钟前
EdgeOne深度解析:从原理、适用场景到COS接入的技术逻辑
java·开发语言·前端·spring·cos
知守观30 分钟前
多模块工程没 install,跑起来的代码是上周的:Maven reactor 依赖解析踩坑
java·maven·intellij idea
多弗朗皮卡丘37 分钟前
C++ 红黑树
开发语言·c++·红黑树
ZoeLandia1 小时前
TypeScript 04:类型断言与类型守卫
开发语言·前端·typescript