以一個(gè)最簡單的HelloWorld程序來介紹一下JNI的最基本的使用方法: cl -Ic:/j2sdk1.4.2/include -I c:/j2sdk1.4.2/include/win32 -LD HelloWorldImp.c -Fehello.dll
1)首先要有一個(gè)HelloWorld.java。
這個(gè)是主文件,里面包括本地方法的java聲明,一個(gè)main函數(shù),還有一個(gè)靜態(tài)代碼段,用來導(dǎo)入所需要的動(dòng)態(tài)連接庫(在windows里是.dll)。
代碼如下:
//HelloWorld.java
class HelloWorld {
public native void displayHelloWorld();//注意關(guān)鍵字native,這就說明這個(gè)方法是用本地方法實(shí)現(xiàn)的。
static {//靜態(tài)代碼段里面導(dǎo)入了hello.dll。
System.loadLibrary('hello');
}
public static void main(String[] args) {//調(diào)用本類的displayHelloWorld方法,(當(dāng)然了方法實(shí)際上是用c語言實(shí)現(xiàn)的)
new HelloWorld().displayHelloWorld();
}
}
2)編譯HelloWorld.java。
使用語句為:、
javac HelloWorld.java
3)使用javah命令生成一個(gè).h文件。
使用語句為:、
javah HelloWorld
這就是實(shí)現(xiàn)displayHelloWorld()方法的c文件的頭文件。文件名為HelloWorld.h代碼如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include
/* 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
可以看到,這個(gè)文件里面主要就是需要在c文件里面實(shí)現(xiàn)的方法的方法聲明。這個(gè)聲明和java文件HelloWorld.java的有一點(diǎn)區(qū)別,原來的方法不帶參數(shù),可是現(xiàn)在有了兩個(gè)參數(shù)。
這兩個(gè)是任何一個(gè)本地方法都必須有的參數(shù)。
第一個(gè)參數(shù)是JNIEnv*,它用于連接從java應(yīng)用程序傳給你的本地方法的參數(shù)和對象。第二個(gè)參數(shù)是一個(gè)jobject,它指向當(dāng)前對象本身,你也可以把它理解為java里面的this變量。對于一個(gè)本地實(shí)例方法,比如這個(gè)例子里的displayHelloWorld方法,jobject參數(shù)就是一個(gè)對象當(dāng)前實(shí)例的引用。對于本地類的方法,這個(gè)參數(shù)就是一個(gè)方法類的引用。在這個(gè)例子里面不需要使用這兩個(gè)參數(shù)。
另外一點(diǎn),可以發(fā)現(xiàn)方法的名稱和java文件里的不一致,這個(gè)方法名由以下幾部分組成:
java_[包名+]類名_java方法名
4)編寫實(shí)現(xiàn)本地方法的c文件
//本例中起名為HelloWorldImp.c
#include
#include 'HelloWorld.h'
#include
JNIEXPORT void JNICALL
Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj)
{
printf('Hello world!/n');//這個(gè)例子中只輸出一行Hello World!
return;
}
5)建立動(dòng)態(tài)連接庫
在windows下面使用下面的語句:
這里面有幾部分。c:/j2sdk1是本地的java home的路徑。在include和include/win32目錄下面有產(chǎn)生動(dòng)態(tài)連接庫需要的幾個(gè).h文件,包括jni.h(在所有的實(shí)現(xiàn)native方法的c文件里面都要include這個(gè)文件)等等。
將產(chǎn)生的.dll文件放到環(huán)境變量path能找到的目錄下?,F(xiàn)在運(yùn)行命令:
java HelloWorld
就會(huì)看到如下輸出:
Hello World!
這就是一個(gè)最簡單的JNI使用方法。