什么是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程序中调用这些功能。