jni程式開發的一般操作步驟如下:
l 編寫java中的調用類
l 用javah生成c/c++原生函數的頭檔案
l c/c++中調用需要的其他函數功能,實作原生函數(原則上可以調用任何資源)
l 将項目依賴的所有原生庫和資源加入到java項目的java.library.path
l 生成java程式
l 釋出java應用和dll庫
jni程式開發示例:
1、 在eclipse項目中建立一個testhello.java,輸入以下内容:
[java] view plain copy
public class testhello {
static {
system.loadlibrary("testhello");
}
public static native void hello(string msg);
public static void main(string[] args) {
hello("hello,kimm!");
}
編譯生成testhello.class檔案。
2、 在指令行下使用javah testhello指令,生成testhello.h頭檔案(就是jni代理stub的接口)。
3、 在vc6中建立一個項目testhello, 項目類型為win32 dynamic-link library。點選ok。
在彈出的視窗中選擇a simple dll project,點選finish。
打開項目所在的檔案目錄,将步驟2中生成的testhello.h檔案複制到此目錄。點選左邊中間的fileview,切換到檔案浏覽模式。在header files上點選右鍵,選擇add files to folder…。
選擇testhello.h檔案,點選ok。
打開stdafx.h檔案,再最後面添加:
#include <jni.h>
#include "testhello.h"
打開testhello.cpp檔案,在最後面添加一段代碼:
jniexport void jnicall java_testhello_hello(jnienv * env, jclass obj, jstring jmsg)
{
const char *strmsgptr = env->getstringutfchars( jmsg , 0);
messagebox( 0, strmsgptr,"message box from vc++ ", 0 );
env->releasestringutfchars( jmsg, strmsgptr);
}
在vc的菜單上選擇tools-options…,打開選項對話框。在directories檔案夾,添加上jdk所在檔案夾下的include和include/win32檔案夾。
點選vc上的菜單項build-build all,生成testhello.dll。
4、 将vc項目debug檔案夾中的testhello.dll複制到testhello.class所在的檔案夾下。
5、 在指令行下輸入java testhello,彈出messagebox對話框。調用win32 api成功。
接下來是設定jvm的搜尋路徑,使其能夠找到你的dll。jvm的搜尋路徑由java.library.path系統屬性決定,其預設值為系統環境變量中的path内容。是以,可以通過修改path變量來達到設定java.library.path屬性的目的(改變之後eclipse需要重新啟動),一般的方法是在path中加入dll所在檔案夾的絕對路徑。另一種方法是在java指令的參數中加入“-djava.library.path=dll所在檔案夾的絕對路徑”來設定(可以用;分開多個路徑)。對于eclipse開發環境上的應用程式,可以通過修改其啟動參數,在vm arguments編輯框中加入前述參數。對于打包出來的eclipse安裝包,可編輯其啟動目錄下的application.ini(假設其啟動檔案為application.exe),在-vmargs後加入前述參數來設定java.library.path的值。需要注意的是,一旦jvm已經啟動,則無法再修改java.library.path的内容了,也就是說,通過:
system.setproperty("java.library.path", "c:/mylib");
這樣的方式是無法達到目的的,因為該屬性是隻讀的。sun公司的論壇上曾經讨論過如何在代碼中修改java.library.path的問題,結論是:不能通過代碼修改!如果嫌"java -djava.library.path=c:/mylib"這樣的方式寫得太死,也隻能是通過shell程式設計之類的方法對路徑進行預處理,以改善其靈活性了。
如果你的dll是封裝在jar包中的,則需要首先将之解壓縮到一個臨時路徑上,然後再将該路徑加入到djava.library.path中,或者幹脆将其解壓縮到系統路徑上。