Java关键字(二)——native_nativeadd-程序员宅基地

技术标签: java  Java关键字详解  后端  开发语言  

  本篇博客我们将介绍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 虚拟机实现下。

  

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

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

  

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

  JNI 的缺点:

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

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

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

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

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

  官方文档如下:Java Native Interface Specification Contents

  步骤如下:

  ①、编写带有 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类

 1 public class HelloJNI {
 2     //native 关键字告诉 JVM 调用的是该方法在外部定义
 3     private native void helloJNI();
 4     
 5     static{
 6         System.loadLibrary("helloJNI");//载入本地库
 7     }
 8     public static void main(String[] args) {
 9         HelloJNI jni = new HelloJNI();
10         jni.helloJNI();
11     }
12 
13 }
View Code

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

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

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

  

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

  

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

  

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

  

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

  

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

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

  安装教程如下:http://blog.csdn.net/altland/article/details/63252757

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

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

  

  接着输入如下命令:

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
View Code

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

  

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

  

  

4、JNI调用C的流程图

  

  图片引用自:https://www.cnblogs.com/Qian123/p/5702574.html

  

5、native关键字

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

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

  native 语法:

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

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

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

  我们在日常编程中看到native修饰的方法,只需要知道这个方法的作用是什么,至于别的就不用管了,操作系统会给我们实现。

  

参考文档:https://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/jniTOC.html 

     https://www.cnblogs.com/Qian123/p/5702574.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ysvae/article/details/81090852

智能推荐

测试一下你对IP地址的掌握水平(网管面试时会用到)-程序员宅基地

文章浏览阅读145次。以下内容摘自《网管员面试宝典》一书。测试一下你对IP地址的理解能力,大家先不看题后的解答,看自己能做出多少题。网管面试时会用到的。面试题1:以下说法正确的是()。A. C类地址就是局域网用的IP地址B.A类地址的网络ID为128个C.网络ID不能以数字0或127开头D.不能使用全0或全1主机ID解析:这道题考的是IP地..._将235.168.20.12地址转换二进制

个人收藏总结_个人收藏简介-程序员宅基地

文章浏览阅读135次。个人收藏总结Ubuntu&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;ROS相关Ubuntu 简介Ubuntu安装ROS安装MDK相关Ubuntu&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;ROS相关Ubuntu 简介链接: Ubuntu 各版本代号简介.Ubuntu安装链接: Ubuntu操作系统的安装.链接: 新手安装Ubuntu 16.04 操作系统.链接: Vmwar_个人收藏简介

C# Profinet,局域网连接,实现读写-程序员宅基地

文章浏览阅读5.5k次。C# Profinet,局域网连接,实现读写文章目录C# Profinet,局域网连接,实现读写前言一、仿真环境安装二、安装后环境介绍及配置1.网卡IP2.启动 S7-PLCSIM Advanced V3.02.启动 TIA Portal V162.C#代码前言使用 TIA Portal V16、S7-PLCSIM Advanced V3.0 实现PLC仿真环境,通过C#编码实现对PLC仿真环境的读写。提示:以下是本篇文章正文内容,下面案例可供参考一、仿真环境安装TIA Portal V_c# profinet

创建型设计模式之抽象工厂模式-程序员宅基地

文章浏览阅读243次。介绍在前面已经讲解过工厂方法模式,这俩者有什么区别呢?前面所说的工厂方法模式只会生产一种具体的产品,而抽象工厂模式生产出来的产品是不确定的。例如不同操作系统中控件的实现不一样,展示效果也不一样,对于操作系统如Android,iOS,WindowPhone本身构成一个产品类,而其控件如Button,TextView也构成产品类,两种产品类两种变化,各有各的特性。定义为创建一组相关或者相互..._设计模式之抽象工厂模式

开始写技术博客-程序员宅基地

文章浏览阅读130次。最近经历了一些,面试,笔试。刚开始觉得自己的专业让自己很吃亏,受了不少打击。然后看了些面经,才认识到自己的水平远没有达到能够进入到理想的互联网公司。其实,无论是精神还是技术水平我都没有对这段校招做好准备。 我希望这里可以记录下我今后成长的过程。

qmake前配置uic路径_Qt入门与提高:K02-01通过简单exe介绍pro基本配置-程序员宅基地

文章浏览阅读145次。版权声明-----------------------------------------------------------------------------------------------该文章原创于Qter开源社区(www.qter.org)作者: 女儿叫老白转载请注明出处!--------------------------------------------------------..._qt uic路径

随便推点

FME进阶视频教程:第1节 FME常用转换器之字符串操作类1_fme 将值转换为字符串-程序员宅基地

文章浏览阅读1.6k次。本教程精选工作中使用频率较高的转换器、数据格式读写、其他能提高FME使用水平的技巧及功能进行细致的讲解。_fme 将值转换为字符串

Focal loss 详解_focal loss实现-程序员宅基地

文章浏览阅读1.5k次。focal loss_focal loss实现

洛谷---P1216 [USACO1.5][IOI1994]数字三角形 Number Triangles_数字三角形 洛谷-程序员宅基地

文章浏览阅读161次。题目描述观察下面的数字金字塔。写一个程序来查找从最高点到底部任意处结束的路径,使路径经过数字的和最大。每一步可以走到左下方的点也可以到达右下方的点。 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 在上面的样例中,从 7→3→8→7→5 的路径产生了最大输入格式第一个行一个正整数 rr ,表示行的数目。后面每行为这个数字金字塔特定行包含的整数。输出格式单独的一行,包含那个_数字三角形 洛谷

HCIE 数通资料下载 肖哥视频下载_肖哥 下载-程序员宅基地

文章浏览阅读7.1k次。说明1:由于百度云链接经常自动失效,建议将链接全部收藏到自己的百度云盘。收藏后,即使我这边失效甚至删除,文件也依旧存在于你的网盘中。说明2:有时提示链接失效或链接打不开,可以尝试其他浏览器打开如:IE 、谷歌、360 、火狐。建议收藏至自己的网盘,以免链接失效后打不开。说明3:若打开压缩包需要密码,所有上传压缩包解压密码都是:hcnp-1234或者123说明4:学习后期用到的部分设备或拓扑打开后需要密码,不同设备默认密码不同,设备密码在视频课程里面有描述具体学习到相应模块后即可知晓(学员刚入.._肖哥 下载

分布式系统技术——分布式锁原理与实战_分布式高并发抢锁原理-程序员宅基地

文章浏览阅读2k次。摘要本博文主要是的介绍分布式锁的原理和应用场景,分布式锁实现主要以Zookeeper(以下简称zk)、Redis、MySQL这三种为主。下面将分别对以上的分布式进行详细的说明。MySQL分布式锁Redis分布式锁Zookeeper分布式锁分布式锁总结参考博文..............._分布式高并发抢锁原理

Kaggle之高级房价预测_kaggle高级房价预测-程序员宅基地

文章浏览阅读306次。Kaggle之高级房价预测0.综述1.加入比赛和下载数据集2.数据分析与赛题思路0.综述Kaggle是一个进行数据发掘和预测竞赛的在线平台。从公司的角度来讲,可以提供一些数据,进而提出一个实际需要解决的问题;从参赛者的角度来讲,他们将组队参与项目,针对其中一个问题提出解决方案,最终由公司选出的最佳方案可以获得奖金。本篇博客是自己入门Kaggle的记录,首先就是一个练手比赛题目:高级房价预测。..._kaggle高级房价预测