`
magicalboy
  • 浏览: 12797 次
  • 性别: Icon_minigender_1
  • 来自: 广州
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

native —— Java 关键字

阅读更多
一. 什么是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的很多好处。如果别无选择,我们可以选择使用本地方法。
  以下链接有关于Native Method相当完备的英文论述:
  http://www.80x86.cn/article.asp?id=1448
0
0
分享到:
评论

相关推荐

    2.java学习第二章——标识符与关键字.pdf

    Java关键字是由Java语言定义的一系列具有特殊含义的单词,它们不能作为普通的标识符来使用。关键字在Java程序设计中起着至关重要的作用,用于定义各种语言结构和控制流。 #### 关键字分类: 1. **用于定义数据类型...

    由浅入深——Java 2自学教程 配书光盘.rar

    《由浅入深——Java 2自学教程》是一本旨在帮助初学者逐步掌握Java编程语言的书籍。配书光盘中的“由浅入深——Java 2自学教程 配书光盘.rar”压缩包文件,包含了书中所有工程素材和源码,这对于读者实践和理解Java...

    Java入门——Java修饰词总结

    Java作为一门广泛使用的编程语言,拥有丰富的语法结构和关键字,其中修饰词(modifiers)是Java语言中的重要组成部分,用于限定类、方法、字段等的访问级别、生命周期以及特性。以下是对Java中11个修饰词的详细介绍...

    Java中JNI的使用(一)——native

    这篇博客文章“Java中JNI的使用(一)——native”很可能是对Java程序员如何首次接触和使用JNI的一个入门教程。 首先,我们来理解“native”关键字。在Java中,`native`是用来标记一个方法的,表示这个方法的实现是在...

    JNI编程(二) —— 让C++和Java相互调用(2)

    这篇博客“JNI编程(二) —— 让C++和Java相互调用(2)”深入探讨了如何在Java应用程序中使用JNI来实现与C++代码的互操作性。以下是对这个主题的详细讲解: 首先,理解JNI的核心概念至关重要。JNI提供了一组接口,让...

    Java JDK 6学习笔记——ppt简体版

    15. **JNI(Java Native Interface)**:Java的本地接口允许Java代码调用C/C++的库,实现性能优化或调用特定平台的功能。 Java JDK 6学习笔记——PPT简体版将详细解析以上知识点,通过实例演示和清晰的讲解,帮助...

    java调用C语言编写的so库中的函数,java调用C语言编写的dll库中的函数

    4. **加载库和调用函数**:在Java中,使用`System.loadLibrary("库名")`加载动态链接库,然后通过`native`关键字声明的本地方法调用库中的函数。 例如,`java jni调用so中的函数api.txt`中可能包含了具体的JNI函数...

    易语言调用Java

    在Java中,使用`native`关键字声明这些方法,并通过`System.loadLibrary`加载对应的本地库(在本例中是易语言编译的动态链接库)。 描述中的"取文本中间"功能可能指的是从一个字符串中提取指定范围的子串。在Java中...

    Java程序员面试宝典——2012版

    《Java程序员面试宝典——2012版》是一份针对Java程序员面试的全面指南,旨在帮助准备面试的程序员深入理解和掌握Java的核心概念和技术。以下是对该文档标题、描述及部分内容涉及的重要知识点的详细解析: ### Java...

    jni例子——使用int数组

    - 在Java层,我们通过`System.loadLibrary()`加载动态链接库,然后通过`native`关键字声明本地方法。 - 在C/C++层,我们通过`JNIEXPORT`和`JNICALL`宏定义导出函数,并使用JNIEnv指针来访问Java对象和方法。 2. *...

    java-ppt.rar_java .ppt_java ppt_java基础 ppt_java基础 ppt_ppt jav

    1. **Java环境搭建**:包括下载JDK(Java Development Kit),设置环境变量如JAVA_HOME, PATH, CLASSPATH,以及如何运行第一个Java程序——经典的"Hello, World!"。 2. **语法基础**:包括数据类型(基本类型如int,...

    Java 语言基础 —— 非常符合中国人习惯的Java基础教程手册

    在 java 语言中,Java 程序的基本单位是类,也就是说:一个 Java 程序是由多个类组成 的。定义一个类与定义一个数据类型是有区别的。在程序设计语言中,把定义数据类型的能 力作为一种很重要的能力来对待。在面向...

    JNI调用及回调就(Java&C) 源码

    在Java中,我们定义一个带有`native`关键字的方法,这个方法的实现是在本地代码中完成的。然后,使用`javah`工具生成对应的C/C++头文件,这个头文件包含了Java方法的C/C++声明。接着,在C/C++代码中实现这个方法,...

    安卓Android源码——代码调用C++代码和C++代码调用代码.zip

    在Java层定义一个包含 native 关键字的方法,例如: ```java public class MyActivity extends AppCompatActivity { static { System.loadLibrary("mylib"); } public native void callCppFunction(); } `...

    JNI开发实例——锅炉压力监控器的源码

    3. **Java端接口**:在Java代码中,我们需要定义一个`native`关键字修饰的方法,这表示该方法将通过JNI调用本地代码。通过`System.loadLibrary()`加载动态链接库(`.dll`或`.so`),使Java应用能够找到并使用本地...

    附录A 使用非JAVA代码.pdf

    1. 在Java源代码中声明本地方法,使用`native`关键字。 2. 使用`javah`工具生成C或C++的头文件,其中包含函数原型。 3. 编写C或C++代码实现这些函数,通常涉及到与特定平台API的交互。 4. 编译本地代码,生成动态...

    Core java欢迎下载

    通过Java的`native`关键字,我们可以定义并实现本地方法,这些方法由JVM通过JNI(Java Native Interface)调用,以实现与操作系统或其他编程语言的深度集成。 4. **Runtime Data Area组件** 运行时数据区域是JVM...

Global site tag (gtag.js) - Google Analytics