天天看點

java JNI開發

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中,或者幹脆将其解壓縮到系統路徑上。

​​

java JNI開發