首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java中的native修饰符

Java中的native修饰符

作者头像
全栈程序员站长
发布于 2022-07-01 11:07:33
发布于 2022-07-01 11:07:33
43100
代码可运行
举报
运行总次数:0
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

今天偶然看代码,发现别人有这样写的方法,并且jar里面有几个dll文件,比较奇怪,于是把代码打开,发现如下写法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public native String GSMModemSMSReadAll(String s, int i);
public native String GSMModemGetErrorMsg(String s);
public native boolean GSMModemIsConn(String s);

觉得挺有趣的,找了找网络上的资料,感觉不错。又一个使用java调用别的语言的方法(以前不知道-_#)

今天花了两个小时把一份关于什么是Native Method的英文文章好好了读了一遍,以下是我依据原文的理解。

一. 什么是Native Method 简单地讲,一个Native Method就是一个java调用非java代码的接口。一个Native Method是这样一个java的方法:该方法的实现由非java语言实现,比如C。这个特征并非java所特有,很多其它的编程语言都有这一机制,比如在C++中,你可以用extern “C”告知C++编译器去调用一个C的函数。 “A native method is a Java method whose implementation is provided by non-java code.” 在定义一个native method时,并不提供实现体(有些像定义一个java interface),因为其实现体是由非java语言在外面实现的。,下面给了一个示例: public class IHaveNatives { native public void Native1( int x ) ; native static public long Native2() ; native synchronized private float Native3( Object o ) ; native void Native4( int[] ary ) throws Exception ; } 这些方法的声明描述了一些非java代码在这些java代码里看起来像什么样子(view). 标识符native可以与所有其它的java标识符连用,但是abstract除外。这是合理的,因为native暗示这些方法是有实现体的,只不过这些实现体是非java的,但是abstract却显然的指明这些方法无实现体。native与其它java标识符连用时,其意义同非Native Method并无差别,比如native static表明这个方法可以在不产生类的实例时直接调用,这非常方便,比如当你想用一个native method去调用一个C的类库时。上面的第三个方法用到了native synchronized,JVM在进入这个方法的实现体之前会执行同步锁机制(就像java的多线程。) 一个native method方法可以返回任何java类型,包括非基本类型,而且同样可以进行异常控制。这些方法的实现体可以制一个异常并且将其抛出,这一点与java的方法非常相似。当一个native method接收到一些非基本类型时如Object或一个整型数组时,这个方法可以访问这非些基本型的内部,但是这将使这个native方法依赖于你所访问的java类的实现。有一点要牢牢记住:我们可以在一个native method的本地实现中访问所有的java特性,但是这要依赖于你所访问的java特性的实现,而且这样做远远不如在java语言中使用那些特性方便和容易。 native method的存在并不会对其他类调用这些本地方法产生任何影响,实际上调用这些方法的其他类甚至不知道它所调用的是一个本地方法。JVM将控制调用本地方法的所有细节。需要注意当我们将一个本地方法声明为final的情况。用java实现的方法体在被编译时可能会因为内联而产生效率上的提升。但是一个native final方法是否也能获得这样的好处却是值得怀疑的,但是这只是一个代码优化方面的问题,对功能实现没有影响。 如果一个含有本地方法的类被继承,子类会继承这个本地方法并且可以用java语言重写这个方法(这个似乎看起来有些奇怪),同样的如果一个本地方法被fianl标识,它被继承后不能被重写。 本地方法非常有用,因为它有效地扩充了jvm.事实上,我们所写的java代码已经用到了本地方法,在sun的java的并发(多线程)的机制实现中,许多与操作系统的接触点都用到了本地方法,这使得java程序能够超越java运行时的界限。有了本地方法,java程序可以做任何应用层次的任务。

二.为什么要使用Native Method java使用起来非常方便,然而有些层次的任务用java实现起来不容易,或者我们对程序的效率很在意时,问题就来了。 与java环境外交互: 有时java应用需要与java外面的环境交互。这是本地方法存在的主要原因,你可以想想java需要与一些底层系统如操作系统或某些硬件交换信息时的情况。本地方法正是这样一种交流机制:它为我们提供了一个非常简洁的接口,而且我们无需去了解java应用之外的繁琐的细节。 与操作系统交互: JVM支持着java语言本身和运行时库,它是java程序赖以生存的平台,它由一个解释器(解释字节码)和一些连接到本地代码的库组成。然而不管怎 样,它毕竟不是一个完整的系统,它经常依赖于一些底层(underneath在下面的)系统的支持。这些底层系统常常是强大的操作系统。通过使用本地方法,我们得以用java实现了jre的与底层系统的交互,甚至JVM的一些部分就是用C写的,还有,如果我们要使用一些java语言本身没有提供封装的操作系统的特性时,我们也需要使用本地方法。 Sun’s Java Sun的解释器是用C实现的,这使得它能像一些普通的C一样与外部交互。jre大部分是用java实现的,它也通过一些本地方法与外界交互。例如:类java.lang.Thread 的 setPriority()方法是用java实现的,但是它实现调用的是该类里的本地方法setPriority0()。这个本地方法是用C实现的,并被植入JVM内部,在Windows 95的平台上,这个本地方法最终将调用Win32 SetPriority() API。这是一个本地方法的具体实现由JVM直接提供,更多的情况是本地方法由外部的动态链接库(external dynamic link library)提供,然后被JVM调用。

三.JVM怎样使Native Method跑起来: 我们知道,当一个类第一次被使用到时,这个类的字节码会被加载到内存,并且只会回载一次。在这个被加载的字节码的入口维持着一个该类所有方法描述符的list,这些方法描述符包含这样一些信息:方法代码存于何处,它有哪些参数,方法的描述符(public之类)等等。 如果一个方法描述符内有native,这个描述符块将有一个指向该方法的实现的指针。这些实现在一些DLL文件内,但是它们会被操作系统加载到java程序的地址空间。当一个带有本地方法的类被加载时,其相关的DLL并未被加载,因此指向方法实现的指针并不会被设置。当本地方法被调用之前,这些DLL才会被加载,这是通过调用java.system.loadLibrary()实现的。 最后需要提示的是,使用本地方法是有开销的,它丧失了java的很多好处。如果别无选择,我们可以选择使用本地方法。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/147251.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
SHELL(bash)脚本编程七:源码简析
bash是用C语言写成的,其源码中只使用了少量的数据结构:数组,树,单向链表,双向链表和哈希表。几乎所有的bash结构都是用这些基本结构实现的。
用户5030870
2019/04/11
2.1K0
Shell脚本编程30分钟入门
mkdir, touch都是系统自带的程序,一般在/bin或者/usr/bin目录下。for, do, done是sh脚本语言的关键字。
ccf19881030
2020/04/16
1.6K0
Shell 主要逻辑源码级分析:SHELL 运行流程 (1)
本文主要介绍了在Linux系统中,通过解析配置文件来获取配置信息,并使用相关函数对配置项进行操作。同时,文章还介绍了配置文件的组织结构,以及配置项的语法和注释。此外,文章还详细介绍了每种配置项的含义和作用,并提供了相关示例。最后,文章还介绍了特殊变量和特殊配置项,以及如何在配置文件中正确设置和使用它们。
李航
2016/09/27
5.3K0
Shell 主要逻辑源码级分析:SHELL 运行流程 (1)
Linux shell 程序设计2——bash的内置命令
常用的内置命令忽略,来看看shell编程中其他一些重要的内置命令: 1、help:显示所有内置命令列表,或显示一个具体命令的用法。 -s: 表示列出命令的语法格式 例子: help -s help help: help [-dms] [pattern ...] 2、echo:用来显示一行文字。默认自动换行。 -n:取消自动换行。 -e:让字符串中的特殊字符起作用,即使字符串在单引号中。 例子: echo hello world 或 echo 'hello world' 或 echo "hello wo
宅蓝三木
2018/02/07
1.6K0
【Linux系统编程】—— 从零开始实现一个简单的自定义Shell
自主Shell命令行解释器(通常称为“shell”)是一个允许用户与操作系统进行交互的命令行界面。用户可以通过Shell输入命令,Shell负责将这些命令传递给操作系统内核,然后执行相应的任务。
用户11286421
2025/01/23
2310
【Linux系统编程】—— 从零开始实现一个简单的自定义Shell
Dash与Bash的语法区别
本文系转载,原文URL为:http://www.igigo.net/archives/169
一见
2018/08/07
2.7K0
Bash 编程易错总结大全
Bash Pitfalls[1] 文章介绍了 40 多条日常 Bash 编程中,老手和新手都容易忽略的错误编程习惯。每条作者在给出错误的范例上,详细分析与解释错误的原因,同时给出正确的改写建议。文中有不少引用的文章,也值得大家仔细阅读。仔细阅读了这篇文章后,收获很多,不感独享,把这篇文章以半翻译半笔记的形式分享给大家。
码农架构
2022/11/17
3K0
Bash 编程易错总结大全
SHELL(bash)脚本编程五:内置命令
bash的内置命令和外部命令的使用方法相同,我们已经介绍了一部分内置命令的用法,本文接着介绍另一些常用内置命令的用法。
用户5030870
2019/04/11
7000
GNU Bash 内置命令 :(冒号)的作用是什么?
一个本身几乎只相当于注释引导符,但却是一个独立的 shell 内置命令的命令,它的作用是什么? 我能看到的唯一可能的原因是这些:
程序熵
2025/02/04
1360
GNU Bash 内置命令 :(冒号)的作用是什么?
nodejs 写 bash 脚本终极方案!
最近在学习bash脚本语法,但是如果对bash语法不是熟手的话,感觉非常容易出错,比如说:显示未定义的变量shell中变量没有定义,仍然是可以使用的,但是它的结果可能不是你所预期的。举个例子:
ConardLi
2021/09/08
2.7K0
nodejs 写 bash 脚本终极方案!
Bash脚本编程(原创)
Bash,Unix shell的一種,在1987年由布萊恩·福克斯為了GNU計劃而编写。1989年釋出第一個正式版本,原先是計劃用在GNU作業系統上,但能运行于大多数类Unix系统的操作系统之上,包括Linux與Mac OS X v10.4都將它作為預設shell。它也被移植到Microsoft Windows上的Cygwin與MinGW,或是可以在MS-DOS上使用的DJGPP專案。在Novell NetWare與Andriod在上也有移植。1990年後,Chet Ramey成为了主要的维护者。為Bourne shell的後繼相容版本與開放原始碼版本,它的名稱來自Bourne shell(sh)的一个双关语(Bourne again / born again):Bourne-Again SHell。
用户2645267
2018/08/04
1.6K0
第三章·Linux系统入门-Bash初识
-多年互联网运维工作经验,曾负责过大规模集群架构自动化运维管理工作。 -擅长Web集群架构与自动化运维,曾负责国内某大型金融公司运维工作。 -devops项目经理兼DBA。 -开发过一套自动化运维平台(功能如下): 1)整合了各个公有云API,自主创建云主机。 2)ELK自动化收集日志功能。 3)Saltstack自动化运维统一配置管理工具。 4)Git、Jenkins自动化代码上线及自动化测试平台。 5)堡垒机,连接Linux、Windows平台及日志审计。 6)SQL执行及审批流程。 7)慢查询日志分析web界面。
DriverZeng
2022/09/26
5290
第三章·Linux系统入门-Bash初识
nodejs写bash脚本终极方案!
最近在学习bash脚本语法,但是如果对bash语法不是熟手的话,感觉非常容易出错,比如说:显示未定义的变量shell中变量没有定义,仍然是可以使用的,但是它的结果可能不是你所预期的。举个例子:
IT大咖说
2021/07/19
4.2K0
Linux中高效编写Bash脚本的10个技巧
Linux开源社区(微信号:cn_linux) 英文:Aaron Kili,翻译:Linux中国/ch-cn 链接:linux.cn/article-8618-1.html Shell 脚本编程 是你在 Linux 下学习或练习编程的最简单的方式。尤其对 系统管理员要处理着自动化任务,且要开发新的简单的实用程序或工具等(这里只是仅举几例)更是必备技能。 本文中,我们将分享 10 个写出高效可靠的 bash 脚本的实用技巧,它们包括: 1、 脚本中多写注释 这是不仅可应用于 shell 脚本程序中,也可用在
顶级程序员
2018/05/03
1.8K0
Linux中高效编写Bash脚本的10个技巧
Linux命令执行过程
内部命令: 指shell内部集成的命令,此类命令无需人为安装,开机后自动运行在内存中,命令help查看所有内部命令的详情,如cd、type、echo、time、true等。
陈不成i
2021/05/25
5K0
Linux基础(五)
一、shell编程基础 1、shell编程 程序=指令+数据 编程风格: 过程式:以指令为中心,数据服务于指令 对象式:以数据为中心,指令服务于数据 shell程序:提供了编程能力,解释能力 2、路径设置 export $PATH:/root export $PATH:. shell脚本到哪儿都能执行(不建议)很危险 vim .bash_profile 生效:. .bash_profile source .bash_profile 问题:当我创建一个shell文件之后,当移动着个文件后,发现他任然在找
企鹅号小编
2018/01/12
1.4K0
Linux基础(五)
Linux Bash基础(一)
介绍Bash之前首先介绍Shell,shell是一个程序,可以称之为壳程序,用于用户与操作系统进行交互。用来区别与核,相当于是一个命令解析器,Shell有很多中,这里列出其中几种 :
xxpcb
2020/08/04
10.5K0
Bash Shell
shell为用户与Kernel之间的一个接口:shell主要是一个命令解释器,它接受并解释用户输入的命令,然后将这些命令传给内核,最后由内核来执行这些命令。Bourn shell是现在所有shell的始祖,C shell增加了若干Bourn shell没有的特性,如命令行历史、别名和作业控制等。Korn shell增加了若干Bourn shell的超集,它具有类似C shell的加强功能。bash与Bourn shell兼容同时加入了csh、ksh和tcsh的一些有用的功能、GNU项目开发、也是实际上的标准Linux shell。系统中所有shell都存放在/etc/shells文件中。
狼啸风云
2019/01/18
1.7K0
Shell内置命令大全,Linux运维工程师收藏!
Shell是一种命令行解释器,它允许用户与操作系统进行交互。在Shell中,有许多内置命令可用于执行各种任务,包括文件操作、进程管理、环境变量设置等。在本文中,我们将详细介绍一些常见的Shell内置命令及其示例用法。
网络技术联盟站
2023/07/14
1.3K0
Shell内置命令大全,Linux运维工程师收藏!
常用bash脚本功能
参考:https://stackoverflow.com/questions/3601515/how-to-check-if-a-variable-is-set-in-bash
YP小站
2021/11/26
1.1K0
相关推荐
SHELL(bash)脚本编程七:源码简析
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档