posts - 73,  comments - 55,  trackbacks - 0

          一、JAVA中所需要做的工作?
          ????????在JAVA程序中,首先需要在類中聲明所調用的庫名稱,如下:?

          1. ????????static?{?
          2. ?????????????????System.loadLibrary(“goodluck”);?
          3. ???????????????}


          ????????在這里,庫的擴展名字可以不用寫出來,究竟是DLL還是SO,由系統自己判斷。?
          ????????還需要對將要調用的方法做本地聲明,關鍵字為native。并且只需要聲明,而不需要具?體實現。如下:?
          ????????public?native?static?void?set(int?i);?
          ????????public?native?static?int?get();?
          ????????然后編譯該JAVA程序文件,生成CLASS,再用JAVAH命令,JNI就會生成C/C++的頭文件。?
          ????????例如程序testdll.java,內容為:?

          1. ????????public?class?testdll?
          2. ?????????{?
          3. ???????????static?
          4. ?????????????????{?
          5. ??????????????????System.loadLibrary("goodluck");?
          6. ?????????????????}?
          7. ???????????public?native?static?int?get();?
          8. ???????????public?native?static?void?set(int?i);?
          9. ???????????public?static?void?main(String[]?args)?
          10. ????????????????{?
          11. ??????????????????testdll?test?=?new?testdll();?
          12. ??????????????????test.set(10);?
          13. ??????????????????System.out.println(test.get());?
          14. ?????????????????}?
          15. ???????????} 


          ????用javac?testdll.java編譯它,會生成testdll.class。?
          ????再用javah?testdll,則會在當前目錄下生成testdll.h文件,這個文件需要被C/C++程序調用來生成所需的庫文件。?

          二、C/C++中所需要做的工作?
          ????對于已生成的.h頭文件,C/C++所需要做的,就是把它的各個方法具體的實現。然后編譯連接成庫文件即可。再把庫文件拷貝到JAVA程序的路徑下面,就可以用JAVA調用C/C++所實現的功能了。?
          ????接上例子。我們先看一下testdll.h文件的內容:?
          ????/*?DO?NOT?EDIT?THIS?FILE?-?it?is?machine?generated?*/?
          ????#include??
          ????/*?Header?for?class?testdll?*/?
          ????#ifndef?_Included_testdll?
          ????#define?_Included_testdll?
          ????#ifdef?__cplusplus?
          ????extern?"C"?{?
          ????#endif?
          ?????/*?
          ??????*?Class:?testdll?
          ??????*?Method:?get?
          ??????*?Signature:?()I?
          ??????*/?
          ????JNIEXPORT?jint?JNICALL?Java_testdll_get?(JNIEnv?*,?jclass);?
          ??????/*?
          ???????*?Class:?testdll?
          ???????*?Method:?set?
          ???????*?Signature:?(I)V?
          ???????*/?
          ????JNIEXPORT?void?JNICALL?Java_testdll_set?(JNIEnv?*,?jclass,?jint);?
          ????#ifdef?__cplusplus?
          ????????????????}?
          ????#endif?
          ????#endif?
          ????在具體實現的時候,我們只關心兩個函數原型?
          ????JNIEXPORT?jint?JNICALL?Java_testdll_get?(JNIEnv?*,?jclass);?和?
          ????JNIEXPORT?void?JNICALL?Java_testdll_set?(JNIEnv?*,?jclass,?jint);?
          ????這里JNIEXPORT和JNICALL都是JNI的關鍵字,表示此函數是要被JNI調用的。而jint是以JNI為中介使JAVA的int類型與本地的int溝通的一種類型,我們可以視而不見,就當做int使用。函數的名稱是JAVA_再加上java程序的package路徑再加函數名組成的。參數中,我們也只需要關心在JAVA程序中存在的參數,至于JNIEnv*和jclass我們一般沒有必要去碰它。?
          ????好,下面我們用testdll.cpp文件具體實現這兩個函數:?
          ????#include?"testdll.h"?
          ????int?i?=?0;?
          ????JNIEXPORT?jint?JNICALL?Java_testdll_get?(JNIEnv?*,?jclass)?
          ??????{?
          ???????return?i;?
          ??????}?
          ????JNIEXPORT?void?JNICALL?Java_testdll_set?(JNIEnv?*,?jclass,?jint?j)?
          ??????{?
          ???????i?=?j;?
          ??????}?
          ????編譯連接成庫文件,本例是在WINDOWS下做的,生成的是DLL文件。(怎么生成DLL文件,我怎么就生成不了?)并且名稱要與JAVA中需要調用的一致,這里就是goodluck.dll?。把goodluck.dll拷貝到testdll.class的目錄下,java?testdll運行它,就可以觀察到結果了。

          posted on 2006-06-01 14:50 保爾任 閱讀(321) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           

          <2025年5月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          常用鏈接

          留言簿(4)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 常德市| 五台县| 隆尧县| 保定市| 弥渡县| 哈巴河县| 宿迁市| 鄂州市| 杭州市| 沁源县| 白沙| 大渡口区| 开化县| 神池县| 綦江县| 利辛县| 芒康县| 沅江市| 山东| 婺源县| 红河县| 固镇县| 营山县| 英超| 泰安市| 皋兰县| 永宁县| 朔州市| 达拉特旗| 龙岩市| 枣庄市| 福州市| 马鞍山市| 德安县| 安吉县| 巴里| 元朗区| 开阳县| 宾阳县| 安徽省| 繁峙县|