我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java关键字native怎么用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java关键字native怎么用

这篇文章主要介绍“Java关键字native怎么用”,在日常操作中,相信很多人在Java关键字native怎么用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java关键字native怎么用”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

native 关键字在 JDK 源码中很多类中都有,在 Object.java类中,其 getClass() 方法、hashCode()方法、clone() 方法等等都是用 native 关键字修饰的。

public final native Class<?> getClass();public native int hashCode();protected native Object clone() throws CloneNotSupportedException;

那么为什么要用 native 来修饰方法,这样做有什么用?

1、JNI:Java Native Interface

在介绍 native 之前,我们先了解什么是 JNI。

一般情况下,我们完全可以使用 Java 语言编写程序,但某些情况下,Java 可能会不满足应用程序的需求,或者是不能更好的满足需求,比如:

  • ①、标准的 Java 类库不支持应用程序平台所需的平台相关功能。

  • ②、我们已经用另一种语言编写了一个类库,如何用Java代码调用?

  • ③、某些运行次数特别多的方法代码,为了加快性能,我们需要用更接近硬件的语言(比如汇编)编写。

上面这三种需求,其实说到底就是如何用 Java 代码调用不同语言编写的代码。那么 JNI 应运而生了。

从Java 1.1开始,Java Native Interface (JNI)标准就成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计 的,但是它并不妨碍你使用其他语言,只要调用约定受支持就可以了。使用java与本地已编译的代码交互,通常会丧失平台可移植性。但是,有些情况下这样做是可以接受的,甚至是必须的,比如,使用一些旧的库,与硬件、操作系统进行交互,或者为了提高程序的性能。JNI标准至少保证本地代码能工作在任何Java 虚拟机实现下。  

Java关键字native怎么用

通过 JNI,我们就可以通过 Java 程序(代码)调用到操作系统相关的技术实现的库函数,从而与其他技术和系统交互,使用其他技术实现的系统的功能;同时其他技术和系统也可以通过 JNI 提供的相应原生接口开调用 Java 应用系统内部实现的功能。

在windows系统上,一般可执行的应用程序都是基于 native 的PE结构,windows上的 JVM也是基于native结构实现的。Java应用体系都是构建于 JVM 之上。  

Java关键字native怎么用

可能有人会问,Java不是跨平台的吗?如果用 JNI,那么程序不就将失去跨平台的优点?确实是这样的。

JNI 的缺点:

①、程序不再跨平台。要想跨平台,必须在不同的系统环境下重新编译本地语言部分。

②、程序不再是绝对安全的,本地代码的不当使用可能导致整个程序崩溃。一个通用规则是,你应该让本地方法集中在少数几个类当中。这样就降低了JAVA和C之间的耦合性。

目前来讲使用 JNI 的缺点相对于优点还是可以接受的,可能后面随着 Java 的技术发展,我们不在需要 JNI,但是目前 JDK 还是一直提供对 JNI 标准的支持。

2、用C语言编写程序本地方法

上面讲解了什么是 JNI,那么我们接下来就写个例子,如何用 Java 代码调用本地的 C 程序。

官方文档如下:https://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/jniTOC.html

步骤如下:

①、编写带有 native 声明的方法的java类,生成.java文件;(注意这里出现了 native 声明的方法关键字)

②、使用 javac 命令编译所编写的java类,生成.class文件;

③、使用 javah -jni java类名 生成扩展名为 h 的头文件,也即生成.h文件;

④、使用C/C++(或者其他编程想语言)实现本地方法,创建.h文件的实现,也就是创建.cpp文件实现.h文件中的方法;

⑤、将C/C++编写的文件生成动态连接库,生成dll文件;

下面我们通过一个 HelloWorld 程序的调用来完成这几个步骤。

注意:下面所有操作都是在所有操作都是在目录:D:\JNI 下进行的。

一、编写带有native声明的方法的java类

public class HelloJNI {    //native 关键字告诉 JVM 调用的是该方法在外部定义    private native void helloJNI();    static{        System.loadLibrary("helloJNI");//载入本地库    }    public static void main(String[] args) {        HelloJNI jni = new HelloJNI();        jni.helloJNI();    }}

用 native 声明的方法表示告知 JVM 调用,该方法在外部定义,也就是我们会用 C 语言去实现。

System.loadLibrary("helloJNI");加载动态库,参数 helloJNI 是动态库的名字。我们可以这样理解:程序中的方法helloJNI() 在程序中没有实现,但是我们下面要调用这个方法,怎么办呢?我们就需要对这个方法进行初始化,所以用 static 代码块进行初始化。

这时候如果我们直接运行该程序,会报“A Java Exception has occurred”错误:  

Java关键字native怎么用

二、使用javac命令编译所编写的java类,生成.class文件

Java关键字native怎么用

执行上述命令后,生成 HelloJNI.class 文件:

Java关键字native怎么用

三、使用javah -jni java类名生成扩展名为 h 的头文件

Java关键字native怎么用

执行上述命令后,在 D:/JNI 目录下多出了个 HelloJNI.h 文件:

Java关键字native怎么用

四、使用C语言实现本地方法

如果不想安装visual studio的,我们需要在 windows平台安装 gcc。

注意安装版本的选择,根据系统是32位还是64位来选择。64位点击下载。

安装完成之后注意配置环境变量,在 cmd 中输入 g++ -v,如果出现如下信息,则安装配置完成:  

Java关键字native怎么用

接着输入如下命令:

gcc -m64  -Wl,--add-stdcall-alias -I"C:\Program Files\Java\jdk1.8.0_152\include" -I"C:\Program Files\Java\jdk1.8.0_152\include\include\win32" -shared -o helloJNI.dll helloJNI.c

-m64表示生成dll库是64位的。后面的路径表示本机安装的JDK路径。生成之后多了一个helloJNI.dll 文件

Java关键字native怎么用

最后运行 HelloJNI:输出 Hello JNI! 大功告成。  

Java关键字native怎么用

3、JNI调用C的流程图

Java关键字native怎么用

4、native关键字

通过上面介绍了那么多JNI的知识,终于到介绍本篇文章的主角&mdash;&mdash;native 关键字了。相信大家看完上面的介绍,应该也是知道什么是 native 了吧。

native 用来修饰方法,用 native 声明的方法表示告知 JVM 调用,该方法在外部定义,我们可以用任何语言去实现它。简单地讲,一个native Method就是一个 Java 调用非 Java 代码的接口。

native 语法:

①、修饰方法的位置必须在返回类型之前,和其余的方法控制符前后关系不受限制。

②、不能用 abstract 修饰,也没有方法体,也没有左右大括号。

③、返回值可以是任意类型

到此,关于“Java关键字native怎么用”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java关键字native怎么用

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Java关键字native怎么用

这篇文章主要介绍“Java关键字native怎么用”,在日常操作中,相信很多人在Java关键字native怎么用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java关键字native怎么用”的疑惑有所帮助!
2023-06-26

Java中Native关键字怎么用

这篇文章将为大家详细讲解有关Java中Native关键字怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、Java中Native关键字的语法本机代码的语法与普通函数定义相同,在函数开头添加了“nat
2023-06-22

JAVA中native方法与synchronized 关键字

native , synchronized [@more@]JAVA中native方法 @与羊共舞的狼 Java不是完美的,Java的不足除了体现在运行速度上要比传统的C++慢许多之外,Java无法直接访问到操作系统底层(如系统硬件
2023-06-03

Java super关键字怎么使用

本文小编为大家详细介绍“Java super关键字怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java super关键字怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1.super介绍我们可以
2023-07-02

Java中super关键字怎么用

本篇内容介绍了“Java中super关键字怎么用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!super有什么用?(1)当子类中构造方法第一
2023-06-29

java final关键字怎么使用

这篇文章主要介绍“java final关键字怎么使用”,在日常操作中,相信很多人在java final关键字怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java final关键字怎么使用”的疑惑有所
2023-07-04

java instance关键字怎么使用

在Java中,关键字"instance"用于判断一个对象是否属于特定的类或其子类的实例。它用于实现类型检查和类型转换。以下是"instance"关键字的使用方法:1. 用于判断对象是否是特定类的实例:语法:对象 instanceof 类名示
2023-10-20

Java中的static关键字怎么用

本文小编为大家详细介绍“Java中的static关键字怎么用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java中的static关键字怎么用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一.static关键字
2023-06-29

Java中transient关键字怎么使用

本篇内容主要讲解“Java中transient关键字怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java中transient关键字怎么使用”吧!一、概要介绍 对于transient
2023-07-06

怎样用Java final 关键字

怎样用Java final 关键字,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。下面好好地讲一讲 final 关键字,也希望给更多的小伙伴一些帮助。尽管继承可以让我们重用现有代
2023-06-03

Java的abstract关键字怎么使用

在Java中,abstract关键字可以用于以下三个地方:1. 抽象类:使用abstract关键字来声明一个抽象类。抽象类是不能被实例化的,只能被继承。抽象类可以包含抽象方法和非抽象方法。抽象方法是没有实现的方法,子类必须实现抽象方法才能使
2023-09-22

Java的Instanceof关键字怎么使用

今天小编给大家分享一下Java的Instanceof关键字怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。举例:cla
2023-06-27

java中this关键字怎么使用

这篇文章主要介绍了java中this关键字怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇java中this关键字怎么使用文章都会有所收获,下面我们一起来看看吧。this 的使用:修饰属性和方法,也可以理
2023-06-26

Java中 transient关键字怎么使用

本篇文章为大家展示了Java中 transient关键字怎么使用,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1. transient的作用及使用方法我们都知道一个对象只要实现了Serilizabl
2023-06-19

java中abstract关键字怎么使用

在Java中,abstract关键字主要用于定义抽象类和抽象方法。1. 抽象类的定义:使用abstract关键字修饰类,将其声明为抽象类。抽象类不能被实例化,只能被继承。抽象类可以包含普通方法和抽象方法。示例代码:```javaabstra
2023-09-23

Java关键字throw、throws、Throwable怎么用

本文小编为大家详细介绍“Java关键字throw、throws、Throwable怎么用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java关键字throw、throws、Throwable怎么用”文章能帮助大家解决疑惑,下面跟着小编的
2023-06-30

Java的关键字abstract怎么使用

本文小编为大家详细介绍“Java的关键字abstract怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java的关键字abstract怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1. 理解ab
2023-06-30

Java中的synchronized关键字怎么用

小编给大家分享一下Java中的synchronized关键字怎么用,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!1、synchronized锁的底层实现原理JVM基于进入和退出Monitor对象来实现方法同步和代码块同步。
2023-06-25

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录