【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 天前
微服务化的基石——持续集成
java·大数据·word·powerpoint·.net
俊昭喜喜里2 天前
java中的继承和多态的区别
java
小羊没烦恼!2 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
譕痕2 天前
JSONObject与JSONArray封装数据格式区别
java·json
胡写代码2 天前
别再前后端各写一套表单校验了
java·后端
小鱼能吃糖2 天前
缺陷修复总览 · mall电商项目:5类缺陷,1个病根,4个业务域
java·电商
此时不提桶,更待何时2 天前
01-06-A-JVM排查实战详解
java·jvm
伞伞悦读2 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
vipxieliang2 天前
ValidX 在 DDD 领域驱动设计中的实践
java·spring boot
C语言小火车2 天前
C/C++ 为什么需要编译器?
开发语言·c++