千家信息网

Java关键字native怎么用

发表于:2025-11-16 作者:千家信息网编辑
千家信息网最后更新 2025年11月16日,这篇文章主要介绍"Java关键字native怎么用",在日常操作中,相信很多人在Java关键字native怎么用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"Java关
千家信息网最后更新 2025年11月16日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 虚拟机实现下。  

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

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

可能有人会问,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"错误:  

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

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

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

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

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

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

注意安装版本的选择,根据系统是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

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

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

3、JNI调用C的流程图

4、native关键字

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

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

native 语法:

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

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

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

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

方法 程序 文件 代码 语言 生成 关键 关键字 系统 命令 平台 技术 应用 编译 标准 学习 功能 动态 应用程序 情况 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 嵌入式软件开发培训课程6 u8租赁版需要服务器吗 lg g3 谷歌服务器 软件开发经理竞聘 人社局网络安全工作方案 网络安全法律法规建设论文 放假期间网络安全管理 浙江虚拟增强现实技术软件开发 第三届安洵杯网络安全挑战赛 计算机网络技术及应用实训 烟台有嘉互联网科技有限公司 护苗 网络安全教育专题 以网络安全为主题的手抄报的字 基于数据库的文件系统 松江区品牌软件开发销售方法 数据库中范式是什么意思 西安工商银行软件开发 开服务器 ddos 自治区网络安全虚假广告打击条例 数据库的检查点技术规范 以下那个功能签名服务器无法实现 网络安全象征 海东网络技术推荐厂家 广东时代网络技术分类创新服务 全市网络安全工作计划2021 计算机网络技术转职业 思课网络技术学院 对日软件开发程序员招聘 大姚县网络安全宣传 手机同屏服务器怎样使用
0