【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 函数并执行。
相关推荐
写代码写到手抽筋7 分钟前
5G上行DCI字段判定:端口 流数 PMI选择详解
java·算法·5g
xieliyu.17 分钟前
Java算法精讲:双指针(二)
java·开发语言·算法
jeffer_liu42 分钟前
Spring AI 生产级实战:裁判员
java·人工智能·后端·spring·大模型
何以解忧,唯有..1 小时前
Python包管理工具pip:从入门到精通
开发语言·python·pip
雪的季节1 小时前
RabbitMQ详解
开发语言
小bo波2 小时前
枚举实战
java·设计模式·枚举·后端开发·代码重构
ice8130331812 小时前
【Python】Matplotlib折线图绘制
开发语言·python·matplotlib
夜微凉42 小时前
三、Spring
java·后端·spring
三品吉他手会点灯2 小时前
C语言学习笔记 - 44.运算符和表达式 - 运算符2 - 除法与取余运算符
c语言·开发语言·笔记·算法
kkeeper~2 小时前
0基础C语言积跬步之动态内存管理
c语言·开发语言