Java开发中会碰到声明为 native的方法,如:public native int hashCode(); 这是一个native方法。为什么存在native方法呢?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、为了加快程序的性能,而将一段时间敏感的代码作为本地方法实现。
这就是Java JNI的应用,小例子如下:
1
2
3
4
5
6
7
8
9
|
public
class
HelloWorld {
public
native
void
displayHelloWorld();
//所有native关键词修饰的都是对本地的声明
static
{
System.loadLibrary(
"hello"
);
//载入本地库
}
public
static
void
main(String[] args) {
new
HelloWorld().displayHelloWorld();
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
/*DO NOT EDI TTHIS FILE - it is mach inegenerated*/
#include<jni.h>
/*Header for class HelloWorld*/
#ifndef_Included_HelloWorld
#define_Included_HelloWorld
#ifdef__cplusplus
extern
"C"
{
#endif
/*
*Class:HelloWorld
*Method:displayHelloWorld
*Signature:()V
*/
JNIEXPORTvoidJNICALL
Java_HelloWorld_displayHelloWorld(JNIEnv*,jobject);
#ifdef__cplusplus
}
#endif
#endif
|
1
2
3
4
5
6
7
8
9
10
11
|
#include"jni.h"
#include"HelloWorld.h"
//#includeotherheaders
JNIEXPORT
void
JNICALL
Java_HelloWorld_displayHelloWorld(JNIEnv*env,jobject obj)
{
printf
(
"Helloworld!\n"
);
return
;
}
|