【JVM】native关键字的使用

news2025/7/12 7:42:07

native关键字的使用

  • 一、JVM体系结构
  • 二、native是什么?
  • 三、native能干什么?
  • 四、native怎么使用?
  • 五、native总结

在研读**《深入理解Java虚拟机》这本书时,看到 Java 虚拟机运行时数据区中有关本地方法栈**(Native Method Stack)的概念,本地方法栈就是为调用 Native 方法服务的,被 Native 修饰的方法不是由 Java 语言实现的,可以是 C/C++ 实现,然后通过 JNIJava Native Interface)实现调用。当然也有 Java 虚拟机栈,是为 Java 方法服务的。本篇主要是 Native 关键字的介绍。

一、JVM体系结构

在这里插入图片描述
本文主要介绍 JVM 体系结构中的一小块区域,即:
在这里插入图片描述

二、native是什么?

native 是一个计算机函数,一个 Native Method 就是一个 Java 调用 非Java 代码的接口。方法的实现由 非Java 语言实现,比如 CC++

一个 Native Method 是这样一个 Java 的方法:该方法的实现由 非Java 语言实现,比如 C。这个特征并非 Java 语言 所特有,很多其它的编程语言都有这一机制,比如在 C++ 中,你可以用 extern “C” 告知 C++ 编译器去调用一个 C 的函数。

native 是与 C++ 联合开发的时候用的!使用 native 关键字说明这个方法是原生函数,也就是这个方法是用 C/C++ 语言实现的,并且被编译成了 DLL ,由 Java 去调用。 这些函数的实现体在 DLL 中,JDK 的源代码中并不包含,你应该是看不到的。对于不同的平台它们也是不同的。这也是 Java 的底层机制。

三、native能干什么?

native 是修饰方法使用的。用 native 修饰的方法表明这个方法是一个调用非 Java 代码的接口。方法的实现由 非Java 语言实现,比如 C 或者 C++,当然也可以是其他语言。

四、native怎么使用?

先看一下 Java 源码中如何使用的。以下是开启一个线程,启动时的源码:(在Thread类中)


    /**
     * Causes this thread to begin execution; the Java Virtual Machine
     * calls the <code>run</code> method of this thread.
     * The result is that two threads are running concurrently: the
     * current thread (which returns from the call to the start method) and the * other thread (which executes its run method).
     * It is never legal to start a thread more than once.
     * In particular, a thread may not be restarted once it has completed
     * execution.
     *
     * @exception  IllegalThreadStateException  if the thread was already
     *               started.
     * @see        #run()
     * @see        #stop()
     */
    public synchronized void start() {
        /**
         * This method is not invoked for the main method thread or "system"
         * group threads created/set up by the VM. Any new functionality added
         * to this method in the future may have to also be added to the VM.
         *
         * A zero status value corresponds to state "NEW".
         */
        if (threadStatus != 0)
            throw new IllegalThreadStateException();

        /* Notify the group that this thread is about to be started
         * so that it can be added to the group's list of threads
         * and the group's unstarted count can be decremented. */
        group.add(this);

        boolean started = false;
        try {
            start0();
            started = true;
        } finally {
            try {
                if (!started) {
                    group.threadStartFailed(this);
                }
            } catch (Throwable ignore) {
                /* do nothing. If start0 threw a Throwable then
                  it will be passed up the call stack */
            }
        }
    }

    private native void start0();

请注意上述代码中的最后一行,这里是一个特殊的方法,我们基本没有写过,如果不读源码也不会看见有这样的写法。

    private native void start0();

我们可以看到 start() 方法里调用了一个 start0(); 方法,接着往下找到 start0() 方法,而 start0() 方法则是此类中一个私有的方法,也没有方法体。感觉奇怪吗?但是它就是这样的写法。

从源码中我们就可以知道它是如何使用的了,即在类中写一个使用 native 关键字修饰的方法,并且此方法没有方法体。这就是 native 关键字的使用方法。

此方法写完之后就不用管它了,剩下的交给 JVM 处理。

package com.iot.back.streamserver.controller;

/**
 * <p>NativeTest 此类用于:</p>
 * <p>@author:hujm</p>
 * <p>@date:2022年11月26日 20:42</p>
 * <p>@remark:</p>
 */
public class NativeTest {

    public static void main(String[] args) {
        new Thread(() -> {
            System.out.println("This is my thread!");
        }, "My Thread").start();

        NativeTest nativeTest = new NativeTest();
        // 调用我们自己写的本地方法,这就完成了使用。非常简单
        nativeTest.helloWorld();
    }

    /**
     * 这里就是我们写的被 native 关键字修饰的 HelloWorld 的本地方法。
     */
    private native void helloWorld();
}

native 的使用方法就是这么简单。

我们只需要记:凡是带了 native 关键字的,说明此方法已经超出了 Java 的作用范围了,表明该方法调用了底层 C/C++ 语言的库了。此类方法会进入本地方法栈,调用本地方法本地接口(JNI),关于 JNI 的介绍有很多,放在另一篇博客中。在这里只需要知道 JNI 的作用即可。

JNI 的作用:扩展了 Java 的使用,融合了不同的编程语言为 Java 所用!最初是想调用 C/C++ 语言。

至于 native 方法如何调用 非 Java 语言的接口的方式和示例我们在另外一篇博客中再详细展开。

五、native总结

  1. native 是一个关键字,其修饰的方法只说明,不实现;
  2. native 方法会被加载到本地方法栈中;
  3. native 并不是 Java 语言实现的,所以在使用此类方法时直接调用即可,不需要管它的底层实现;
  4. native 方法是 Java 语言调用其他语言的时候使用的,底层实现不是 Java
  5. native 方法实际上是 Java 语言调用底层操作系统的方法,Java 只能调用,不能查看和修改;
  6. Java 语言是跨平台的,自然而然会失去对底层的控制,所以想要调用底层方法,就必须使用 native 方法间接调用底层操作系统的方法;
  7. native 方法在企业级应用中较为少见,随着 Java 语言的发展,native 方法越来越少;

关于 native 的介绍,仅是个人见解,如果有错误之处,欢迎在评论区指教!

完结!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/38466.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

鲜花在线销售平台的设计与实现/鲜花商城/网上花店管理系统

摘 要 为了解决客户便捷地在网上购物&#xff0c;本文设计和开发了一个鲜花在线销售平台。本系统是基于web架构设计&#xff0c;SSM框架&#xff0c;javascript技术的前台页面设计与实现&#xff0c;使用Mysql数据库管理&#xff0c;综合采用java模式来完成系统的相关功能。主…

【GlobalMapper精品教程】028:栅格计算器的使用方法总结

文章目录 一、栅格计算器简介二、栅格计算器应用举例1. 归一化植被指数NDVI2. 归一化水体指数NDWI3. 归一化建筑指数NDBI一、栅格计算器简介 GlobalMapper中也提供了栅格计算器工具,可以方便的进行栅格计算、波段计算、指数计算等,使用方法有点儿像Envi软件。 用户可以使用系…

世界杯来了,让 Towhee 带你多语言「以文搜球」!

四年一度的世界杯已正式拉开战幕&#xff0c;各小组比赛正如火如荼地进行中。在这样一场球迷的盛宴中&#xff0c;不如让 Towhee 带你「以文搜球」&#xff0c;一览绿茵场上足球战将们的风采吧&#xff5e; 「以文搜球」是跨模态图文检索的一部分&#xff0c;如今最热门的跨模…

Leetcode刷题Day5休息 Day6----------哈希表

Leetcode刷题Day5休息 & Day6----------哈希表 1. 哈希表理论基础 数组、Set、Map 如果数据量小------------数组 如果数据量大------------Set 如果有Key、value------------Map 文章讲解&#xff1a;https://programmercarl.com/%E5%93%88%E5%B8%8C%E8%A1%A8%E7%90%86…

【雷达检测】基于复杂环境下的雷达目标检测技术(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

数据之道读书笔记-06面向“自助消费”的数据服务建设

数据之道读书笔记-06面向“自助消费”的数据服务建设 数据底座建设的目标是更好地支撑数据消费&#xff0c;在完成数据的汇聚、整合、联接之后&#xff0c;还需要在供应侧确保用户更便捷、更安全地获取数据。一方面业务人员希望尽可能快速地获取各种所需的数据&#xff0c;另一…

基于双目相机拍摄图像的深度信息提取和目标测距matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB程序 1.算法描述 双目相机一般由左眼和右眼两个水平放置的相机组成。当然也可以做成上下两个目&#xff0c;但我们见到的主流双目都是做成左右的。在左右双目的相机中&#xff0c;我们可以把两个相机都看作针…

大数据毕设选题 - 深度学习图像超分辨率重建(opencv python cnn)

文章目录0 前言1 什么是图像超分辨率重建2 应用场景3 实现方法4 SRResNet算法原理5 SRCNN设计思路6 代码实现6.1 代码结构组织6.2 train_srresnet6.3 训练效果7 最后0 前言 &#x1f525; Hi&#xff0c;大家好&#xff0c;这里是丹成学长的毕设系列文章&#xff01; &#x…

读写分离和主从复制

这是只有一个数据库的情形&#xff0c;此时增删改查都是针对这个数据库而言 存在两个问题&#xff1a;所有压力都是由一台数据库承担&#xff0c;数据库压力很大 而且&#xff0c;一旦这个数据库发生故障&#xff0c;数据丢失&#xff0c;拿数据就全都没了 现在有两个数据库&…

总结使人进步,4句真章的理解和实践

在“总结使人进步&#xff0c;遵循事物的客观发展规律&#xff1b;祸福相依&#xff0c;知行合一”这篇文章里&#xff0c;首次全面提出了4句真章。 这么多年&#xff0c;最有感触的4句话。 一、4句真章 1、总结使人进步 2、遵循事物的发展规律 3、祸福相依 4、知行合一 …

muduo库中实现Protbuf编码器与消息分发器

文章目录1. protobuf的type name反射机制2. Protobuf编码器2.1 protbuf传输格式2.2 message转换为Buffer2.3 Buffer转换为message2.4 onMessage和send3. 消息分发器dispatcher3.1 成员变量3.2 onProtobufMessage3.3 registerMessageCallback4. 简单RPC4.1 query.proto4.2 serve…

QT:debug日志—打不开头文件以及qDebug和Q_CLASSINFO的使用

这个是因为链接器在给定路径上搜索不到对应的头文件&#xff0c;而大多数的Qt相关的头文件都集中在一个include文件夹里&#xff1a; 我电脑上的路径是&#xff1a;C:\Qt\Qt5.9.7\5.9.7\msvc2017_64\include 然后我们在项目设置里&#xff1a; 注意&#xff0c;这边要加上\*&…

Linux系统配置及服务管理-06-存储管理

基本分区 磁盘简介 磁盘/硬盘/disk是一个东西&#xff0c;不同于内存的是容量比较大。 类型 从工作原理区分 机械 机械硬盘即是传统普通硬盘&#xff0c;主要由&#xff1a;盘片&#xff0c;磁头&#xff0c;盘片转轴及控制电机&#xff0c;磁头控制器&#xff0c;数据转换…

钢材缺陷检测系统-ui界面

钢材缺陷检测系统-ui界面 之前写过这个博客: 工业缺陷检测项目实战(二)——基于深度学习框架yolov5的钢铁表面缺陷检测 里面介绍了使用yolov5进行训练的步骤。今天我们一起学习利用qt将缺陷检测封装为一个系统。 效果 首先看看效果&#xff1a; 我们运行&#xff0c;先可以看…

26岁月薪从7k到17K,这一切都要从那年失业讲起...

女生&#xff0c;目前在成都做了快4年的测试 先来说说我自己是怎么入行的以及我学到的一些经验分享&#xff0c;希望能帮助到更多的朋友们 我大学学的并不是计算机相关专业&#xff0c;学的市场营销&#xff0c;毕业后大部分同学都去做销售或者商务BD了&#xff0c;奈何自己性…

Redis复习笔记

文章目录Redis一、redis入门1.1、NoSQL的引言1.2、为什么是NoSQL1.3、NoSQL的四大分类1.3.1 键值(Key-Value)存储数据库1.3.2 列存储数据库1.3.3 文档型数据库1.3.4 图形(Graph)数据库1.4 NoSQL应用场景1.5 什么是Redis1.6 Redis特点1.7 Redis 安装二、redis数据库相关指令2.1 …

vue-swiper组件化:解决异步请求数据时swiper过早初始化问题:

最初始的swiper组件封装&#xff1a; <body><div id"box"><swiper></swiper></div><script>Vue.component("swiper", {template: <div class"swiper"><div class"swiper-wrapper">…

PC_磁盘HDD_SSD/存储介质(材料工艺)

文章目录外存磁盘存储器组成磁盘驱动器磁盘控制器盘片platter存储区域磁盘结构磁道track道距位密度扇区sector&#x1f388;/块Block&#x1f386;磁头(Head)圆柱面cylinder磁记录原理磁盘性能指标记录密度磁盘的容量非格式化容量格式化容量数据传输率磁盘转速旋转周期T例平均存…

自学网络安全?一般人我还是劝你算了吧

前言 本人纯屌丝一枚&#xff0c;在学网络安全之前对电脑的认知也就只限于上个网&#xff0c;玩个办公软件。这里不能跑题&#xff0c;我为啥说自学网络安全&#xff0c;一般人我还是劝你算了吧。因为我就是那个一般人。 基础真的很简单&#xff0c;是个人稍微认点真都能懂&a…

SpringBoot 常用配置

SpringBoot的配置文件格式 SpringBoot的配置文件支持properties和yml&#xff0c;甚至他还支持json。 更推荐使用yml文件格式&#xff1a; yml文件&#xff0c;会根据换行和缩进帮助咱们管理配置文件所在位置 yml文件&#xff0c;相比properties更轻量级一些 yml文件的劣势&am…