什么是Native Method

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

在定义一个Native Method的时候,并不提供方法的实现体,有些类似于Java语言中的接口,因为其实现体是由非Java语言在外面实现的

在java中native是关键字。它一般在本地声明,异地用C和C++来实现。它的声明有几点要注意:1)native与访问控制符前后的关系不受限制。2)必须在返回类型之前。3)它一般为非抽象类方法。4)native方法在异地实现,象抽象方法一样,所以没有方法体,以分号结束。如下列5种声明:

native public void f();                         正确。
          private native void f();                        正确。
          protected int native f();                      错误,返回类型位置不对,返回类型必须在native之后。
          public abstract native void f();            native必然不是abstract的。
          native int f(){}                                     错误,因为存在方法体{}
          public static native f();                         正确。static与native方法位置随意。

       下例是比较典型的native的使用方式,用loadLibrary导入存在源文件目录下的*.dll文件,然后定义native方法时,与c/c++实现的函数有相同的参数和返回类型。

public class OpticalFlowCalculateDll{ 
 
    static{ 
 
        System.loadLibrary("OpticalFlow"); 
 
    } 
    public native static void setImage();     
 
    public native static int[] getGoodFeatureListForTrack();     
 
    public native static int[] getMatchedFeatureList();     
 
    public native static int getFeatureListSize();     
 
    public native static void dispose(); 
 
}

  使用java与本地已编译的代码交互,通常会丧失平台可移植性。但是,有些情况下这样做是可以接受的,甚至是必须的,比如,使用一些旧的库,与硬件、操作系统进行交互,或者为了提高程序的性能。JNI标准至少保证本地代码能工作在任何Java 虚拟机实现下。

JNI的设计目的:

  ·标准的java类库可能不支持你的程序所需的特性。

  ·或许你已经有了一个用其他语言写成的库或程序,而你希望在java程序中使用它。

  ·你可能需要用底层语言实现一个小型的时间敏感代码,比如汇编,然后在你的java程序中调用这些功能。