jvm与Native Method

今天接触到一个native method,即原生(本地)方法,于是我对此查了一些相关资料。

一、Native Method

1、定义:一个native method就是一个Java调用非Java代码的接口。Java方法的具体实现由c或c++。

2、特点:与java环境外交互:与某些硬件交互信息

        与操作系统交互,底层系统

3、笔记:native标识符可与除abstract的任何Java标识符连用,这是合理的,因为abstract没有实现方法。

        含有native方法的类被子类继承,那么子类可以继承native这个方法再重写。

二、JVM与Native method

1、JVM(支持Java语言与运行库):由解释器(解释字节码)和连接本地方法的库组成。

解释器由c编写(与外界交互),jre库大部分是由Java实现,也有通过一些本地方法与外界交互。

2、关系:

类第一次使用时,解释器会加载字节码,字节码的开头包含该类所有方法描述符的list(储存地址、参数、描述符

等)。如果一个方法描述符内有native,则这个描述符块将有一个指向该方法的指针。实现方法存储在DLL文件中,

被操作系统加载在Java程序的地址空间,当加载类时其相关DLL文件不会被加载,只有当该方法被调用前才被加载,

通过调用java.system.loadLibrary()实现。

三、如何查看该原生方法的源代码

了解了上述相关内容以后,那么如何才能查看该原生方法的源代码呢?不是说Java是一种开源软件吗?为何在jdk源码中无法查看呢?具体详解链接自:OpenJDK和Sun/OracleJDK 区别与联系  这个博客。

查看原生方法的源代码方法如下:

Java源码中的native方法是不能直接在jdk中看到的,因为jdk不是开源的,要看到的话需要sun授权才行,现在只有openjdk是被sun公司授权,所以要查看的话,下载 完整的OpenJDK源码包 

接下来里面解压后找到jdk目录(也就是OpenJDK里的大部分类库的实现)的内容了。其中 

src/
    share/       平台无关的实现
    classes/     平台无关的Java代码实现
    native/      平台无关的native代码实现(主要是C)


classes与native目录的结构就跟Java的包(package)目录结构一样,两边是对应的。知道这个关系就能很快找到JDK类库里Java一侧声明为native的方法在C里的实现函数。 

四、关于Java中native的构建与适用情况(JNI)

Java不是完美的,Java的不足除了体现在运行速度上要比传统的C++慢许多之外,Java无法直接访问到操作系统底层(如系统硬件等),为此Java使用native方法来扩展Java程序的功能。

  可以将native方法比作Java程序同C程序的接口,其实现步骤:
  1、在Java中声明native()方法,然后编译。
  2、用javah产生一个.h文件。
  3、写一个.cpp文件实现native导出方法,其中需要包含第二步产生的.h文件(注意其中又包含了JDK带的jni.h文件)。
  4、将第三步的.cpp文件编译成动态链接库文件。
  5、在Java中用System.loadLibrary()方法加载第四步产生的动态链接库文件,这个native()方法就可以在Java中被访问了。

  JAVA的native方法适用的情况:
  1、为了使用底层的主机平台的某个特性,而这个特性不能通过JAVA API访问。
  2、为了访问一个老的系统或者使用一个已有的库,而这个系统或这个库不是用JAVA编写的。
  3、为了加快程序的性能,而将一段时间敏感的代码作为本地方法实现。

猜你喜欢

转载自blog.csdn.net/qq_36042506/article/details/53946467