Java Native 方法

编程入门 行业动态 更新时间:2024-10-23 23:27:49

Java Native <a href=https://www.elefans.com/category/jswz/34/1771314.html style=方法"/>

Java Native 方法

Java 调用别的语言写的方法

1.什么是Native Method

简单的说就是Java调用其他非Java代码的接口,一个Native Method是这样的一个Java方法:该方法的实现是由非Java语言实现,譬如C,这些特征并非Java所有的特征,很多编程语言都有这一机制

在定义一个Native Method的时候,并不提供方法的实现体,有些类似于Java语言中的接口,因为其实现体是由非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 ;} 

Native方法暗示这些方法是有实现体的,只不过这些实现体都不是用Java写的,跟抽象类的差距就是抽象类是没有实现体的,Native与其他标识符同用的时候,其意义与无Native关键字的时候是大概一样的,譬如Native static的意思是在不产生实例的时候直接调用,这样非常的方便,在比如你想同Native调用一个C的类库的时候,上面的第三个方法用到了synchronzed ,JVM 在进入这个方法实现体之前将会执行同步锁机制,类似于Java线程中同步锁

一个Native Method将可以返回任何的Java类型,包括非基本数据类型,而且同样可以进行异步控制,当一个Native Method接收到一个非基本数据类型的时候,譬如Object或者一个数组 ,这个方法可以访问这非些基本型的内部,但是这将使这个native方法依赖于你所访问的java类的实现。有一点要牢牢记住:我们可以在一个native method的本地实现中访问所有的java特性,但是这要依赖于你所访问的java特性的实现,而且这样做远远不如在java语言中使用那些特性方便和容易。

Native Method的存在并不会对其他类的调用产生影响,甚至调用这些方法的其他类,根本就知道它是本地方法,JVM将控制他调用本地方法的所有细节,需要主要当我们把一个本地方法声明为final的时候,在被编译的时候,可能因为内联而产生效率升高的效果,但是一个Native Method 是否能够获得这样的效果,是值得怀疑的,但是这只是代码优化方面的问题。

本地方法的作用:本地方法非常的有用,因为它有效的扩充了JVM,事实上我们所写的Java方法已经用到了本地方法,同样一个Native Method被生命为final的时候,它被继承的时候将无法重写。

2.为什么要使用本地方法

Java使用起来非常的方便,然后有些层次的任务使用起来不方便,或者对程序的效率很在意的时候,问题就出现了

与Java环境外交互:有时候Java 需要与Java外面的环境交互,这是本地方法存在的主要原因,你可以想象Java需要与有些底层系统如操作系统或某些硬件交互的情况,本地方法正是这样的一种交流机制:他为我们提供一个简洁的接口,而我们无需了解Java之外的的繁琐细节。

与操作系统交互:JVM支持Java语言与运行时库,他是Java平台赖以生存的平台,他由一个解释器(解析字节码)和一些链接到本地的代码库组成,然而不管怎样它毕竟不是一个完整的操作系统,经常需要依赖一些底层的支持,这些底层常常是强大的操作系统,通过使用本地方法我们得以使用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调用。

3.JVM 怎样使Native Method方法跑起来

我们知道当一个类被使用的时候,这些类的字节码会被加载到内存,并且只会回载一次,在这个被加载字节码的入口,维持着一个该类所有方法描述符list,描述符包含了一些信息,例如方法存放的地方,方法代码存放在何处,一些参数 方法的访问修饰符等等。

如果一个方法的描述符有native关键字,这个描述符块有一个只想该方法的实现的指针,这些实现在一个DLL文件内,但是他们会被操作系统加载到Java程序的内存空间,当一个带有本地方法的类被加载的时候,其相关的DLL未被加载,因此指向方法的设置为未被设置,当本地方法调用之前,这些DLL才会被加载,这是通过调用java.system.loadLibrary实现的。

使用本地方法是有开销的,他丧失了很多Java的好处。

转载自:

更多推荐

Java Native 方法

本文发布于:2023-06-13 00:01:54,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/670310.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:方法   Java   Native

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!