1.編寫帶有native聲明的方法的java類
建立HelloWorld.java
class HelloWorld{
public native void displayHelloWorld();
static{
System.loadLibrary("HelloWorldImpl");
}
public static void main(String args[]){
new HelloWorld().displayHelloWorld();
}
}
聲明native方法:如果你想將一個方法做為一個本地方法的話,那麼你就必須聲明改方法為native的,並且不能實現。其中方法的參數和傳回值在後面講述。 Load動態庫:System.loadLibrary("HelloWorldImpl");載入動態庫(我們可以這樣理解:我們的方法 displayHelloWorld()沒有實現,但是我們在下面就直接使用了,所以必須在使用之前對它進行初始化)這裡一般是以static塊進行載入的。同時需要注意的是System.loadLibrary();的參數“hello”是動態庫的名字
2.使用javac命令編譯所編寫的java類
3.使用javah -jni java類名產生副檔名為h的標頭檔
得到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
這裡我們可以這樣理解:這個h檔案相當於我們在java裡面的介面,這裡聲明了一個 Java_HelloWorld_displayHelloWorld (JNIEnv *, jobject);方法,然後在我們的本地方法裡面實現這個方法,也就是說我們在編寫C/C++程式的時候所使用的方法名必須和這裡的一致
4.使用C/C++實現本地方法
建立HelloWorldImpl.cpp
#include "jni.h"
#include "HelloWorld.h"
JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj){
printf("Hello world!\n");
return;
}
5.將C/C++編寫的檔案產生動態串連庫
本人採用以下方法:
5.1從%JAVA_HOME%/include下COPY
與HelloWorldImpl.cpp同目錄。
5.2 執行cl/LD HelloWorldImpl.cpp 得到HelloWorldImpl.dll檔案
也有採用如下方法
產生動態庫這裡以在Windows中為例,需要產生dll檔案。在儲存HelloWorldImpl.cpp檔案夾下面,使用VC的編譯器cl產生。 cl -I%java_home%\include -I%java_home%\include\win32 -I"%cpp_home%"\include -LD HelloWorldImpl.cpp -Fehello.dll 注意:產生的dll檔案名稱在選項-Fe後面配置,這裡是hello,因為在HelloWorld.java檔案中我們loadLibary的時候使用的名字是hello。當然這裡修改之後那裡也需要修改。另外需要將-I%java_home%\include -I%java_home%\include\win32 -I"%cpp_home%"\include參數加上,因為在第四步裡面編寫本地方法的時候引入了jni.h檔案(引入了哪些檔案就要加上包含這些檔案的參數)。還要注意的一點是:添加環境變數LIB=%cpp_home%\lib(我機器上的cpp_home=E:\Program Files\Microsoft Visual Studio\VC98),因為需要與裡面的一些lib檔案連結
6.執行class得到結果,註:以上過程檔案均在同一檔案夾下