Java虽然强大,但对于面向底层的一些操作还是略显不足,此时唯有通过JNI来进行调用本地方法来扩展Java程序的功能。可以将native方法类比为Java中声明的接口方法,然后在外部用其他语言进行实现。
其实现步骤如下:
1、在Java中声明native()方法,然后编译;
2、用javah产生一个.h文件;
3、写一个.c或.cpp文件实现native导出方法,其中需要include第二步产生的.h文件,另根据需要可以自己
4、将第三步的.c或.cpp文件编译成动态链接库文件(这个不同的系统下操作方法 不同);
5、在Java中用System.loadLibrary()方法加载第四步产生的动态链接库文件,这个native()方法就可以在
- public
class HelloWorld { -
//此处定义的便是native方法 -
native public void sayHello(); -
-
public static void main (String args[]) { -
(new HelloWorld()).sayHello(); -
} -
static{ -
//这个作何用处下面的步骤会作说明 -
System.loadLibrary ("HelloWorld"); -
} - }
2.通过javah -jni Test,会生成一个Test.h的头文件,其内容如下
#include <jni.h>
#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
JNIEXPORT void JNICALL Java_HelloWorld_sayHello
#ifdef __cplusplus
}
#endif
#endif
3接着我再编写一个Test.c文件来进行
#include "jni.h"
#include "HelloWorld.h"
#include<stdio.h>
JNIEXPORT void JNICALL Java_HelloWorld_sayHello (JNIEnv * env, jobject obj) {
printf("Hello,the World!!!");
}
4将Test.c编译成动态链接库,下面是其命令
gcc -shared -fPIC -I/usr/lib/jvm/jdk1.6.0_34/include/ -I/usr/lib/jvm/jdk1.6.0_34/include/linux/ /home/xc/mapping/jni/HelloWorld.c -o libHelloWorld.so
解释一下上面的操作,当然我的系统是Ubuntu10.04,不过关于jdk安装之后的路径应该大同小异,自己做下适当的调整即可
/usr/lib/jvm/jdk1.6.0_34/include下包含的jni.h
/usr/lib/jvm/jdk1.6.0_34/include/linux下包含的是jni-md.h
-shared 是设置生成share object的标志
libHelloWorld.so即为我们需要的动态链接库(等同于Windows下的*.dll文件)。
5.可以再看Test.java中 System.loadLibrary("HelloWorld");的作用了,就是让其加载libtest而已。
顺便说明一下,用static声明的域不需要用try..catch来捕获异常,否则还是捕获一下为好。
OK,现在大功告成,让我们来运行该程序即可