早就听说了 jni 可是到现在我才岛鼓出来,是不是很笨.......
好了费话不说了,开始进入正题
1.首先创建一个java类 Hello.java
public class Hello {
//在静态块里面,把lib.dll导进来,记住不能写.dll的,否则会找不到的
static
System.loadLibrary("lib");
//申明一个本地方法,该本地方法的实现在lib.dll中
public native static void printString(String str);
public static void main(String[] args) {
Hello.printString("Hello");
}
2.用javac编译这个类 : java Hello.java
用javah对.clss生成C的头文件:javah Hello
现在头文件Hello.h的内容是:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class Hello */#ifndef _Included_Hello
#define _Included_Hello
#ifdef __cplusplus
extern "C" {
#endif
* Class: Hello
* Method: printString
* Signature: (Ljava/lang/String;)V
JNIEXPORT void JNICALL Java_Hello_printString
(JNIEnv *, jclass, jstring);#ifdef __cplusplus
#endif
#endif
要提醒大家的是可能jdk的版本不同,生成的头文件可能有点不同,,不过都大同小意,改改就行了,我用的是jdk1.5,根据上面的头文件,改一个.c文件,(现在只把这个.h的文件后辍改成.c就可以,先这么写) 记住最好复制一个,因为这个头文件还有用了,如何改一个.c文件呢?下面我告诉
先打开一个Visual C++,创建一个工程,记住这个工程应该是生成dll的工程,,应该选择Win32 Dynamic-Link Library
工程创建好了,那么把那个.c文件导进来
在导之前先把.c文件复制到工程下
以下是我改的.c文件
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class Hello */#ifndef _Included_Hello
#define _Included_Hello
#ifdef __cplusplus
extern "C" {
#endif
* Class: Hello
* Method: printString
* Signature: (Ljava/lang/String;)V
JNIEXPORT void JNICALL Java_Hello_printString
(JNIEnv *env, jclass obj, jstring str)
printf(str);
#ifdef __cplusplus
#endif
#endif
这个时候你可能已经发现了 #include <jni.h>
这个头文件,它在哪里了,找到他了,应该入到哪了呢?/
jni.h在jdk1.5目录下的include目录下
那么把它放到visual目录下VC98/include下,编辑文件生成dll
在工程下找到debug 下的dll改名为lib.dll,把这个dll放到jdk1.5的bin目录下
现在用java Hello
就会输出Hello.哈哈,是不是很简单....................