第一步 编写Java类首先,我们创建一个名为jnitest的Eclipse工程,并新建一个src源代码目录。
这里我们编写两个Java类,一个命名为HelloWorld,一个命名为TestDLL。 HelloWorld类包含一个本地方法displayHelloWorld(), TestDLL用于测试这个本地方法。
HelloWorld的源码清单如下:
[Java] 纯文本查看 复制代码
List1. HelloWorld.java源码
public class HelloWorld {
public native void displayHelloWorld();①
static{
System.loadLibrary("HelloWorld"); ②
}
}
说明:①是java本地方法申明;②装入动态链接库,"HelloWorld"是要装入的动态链接库名称。
[Java] 纯文本查看 复制代码
TestDLL源码如下:
List2. TestDLL.java源码
public class TestDLL {
public static void main(String[] args){
HelloWorld helloWorld = new HelloWorld();
helloWorld.displayHelloWorld();
}
}
第二步 编译Java类在Eclipse工具中编译Java类。编译后的class文件会自动放入工程目录下的bin目录中。第三步 生成C/C++头文件在windows中打开一个命令窗口,进入jnitest工程所在目录下的bin目录如:D:\workspace\jnitest\bin。键入javah -classpath D:\workspace\jnitest\bin HelloWorld命令生成头文件HelloWorld.h。内容如下:[Java] 纯文本查看 复制代码
List3. HelloWorld.h源码
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloWorld */
#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: HelloWorld
* Method: displayHelloWorld
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
第四步 编写本地方法实现用VC6创建HelloWorld Win32动态链接库工程。将上述生成的头文件HelloWorld.h拷贝到
D:\Program Files\Microsoft Visual Studio\MyProjects\HelloWorld目录下面。
将D:\j2sdk1.4.2\include目录下的jni.h和D:\j2sdk1.4.2\include\win32\jni_md.h两个头文件拷贝到VC安装目录下的D:\Program Files\Microsoft Visual Studio\VC98\Include目录下面。在VC IDE中新建HelloWorld.cpp文件,实现头文件中声明的方法并编译生成DLL。
List4. HelloWorld.cpp源码
[C] 纯文本查看 复制代码
#include "HelloWorld.h"
#include <stdio.h>
/*
* Class: HelloWorld
* Method: displayHelloWorld
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld
(JNIEnv *, jobject)
{
printf("Hello World!\n");
return;
}
第五部 运行测试程序注意,③必须设置好DLL搜索路径,或者将dll拷贝到C:\WINDOWS\system32下面
总结
使用JNI的好处:
a、可以使用JNI来实现“本地方法”(native methods),并在JAVA程序中调用它们,一般是在java中调用C的函数;
相反的也可以用C来调用Java中的方法,这样可以复用很多以前写过的代码。
b、JNI支持一个“调用接口”(invocation interface),它允许你把一个JVM嵌入到本地程序中。
本地程序可以链接一个实现了JVM的本地库,然后使用“调用接口”执行JAVA语言编写的软件模块。