千里冰封
          JAVA 濃香四溢
          posts - 151,comments - 2801,trackbacks - 0
          昨天我們講了要開發JNI的幾個工具的安裝和下載,今天我們講它們的基本使用.為了驗證我們昨天的PATH確實設好了.我們可以進入CMD下面,輸入如下語句:gcc --version
          如果輸出類似如下的話,就說明安裝正確了:

          gcc (GCC) 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)
          Copyright (C) 2004 Free Software Foundation, Inc.
          This is free software; see the source for copying conditions.  There is NO
          warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


          既然我們這個已經裝好了,現在就打開Netbeans6.0吧.Netbeans6.0現在提供的下載分幾個版本,我們下載的是完全版,就是什么功能都有的,完全版最大,如果下載別的版本的話,就不能用它來做C/C++的程序了.啟動速度當然就最慢了.啟動的時候,耐心的等待一下,反正啟動界面挺好看的.

          好了,Netbeans啟動了,我們先建一個JAVA工程,名字就叫TestNative吧.如何使用Netbeans就不是本文的目的了:).大家可以去參考別的資料。然后在TestNative里面建一個類,就叫testnative1.Main吧。然后在里面寫上如下的內容:.

          /*
           * Main.java
           *
           * Created on 2007-10-19, 17:23:02
           *
           * To change this template, choose Tools | Templates
           * and open the template in the editor.
           
          */

          package testnative1;

          /**
           *
           * 
          @author hadeslee
           
          */
          public class Main {

              
          /**
               * 
          @param args the command line arguments
               
          */

              
          public static void main(String[] args) {
                  
          // TODO code application logic here
                  Main m=new Main();
                  System.loadLibrary(
          "cygHello");
                  m.sayHello(
          "hadeslee");
                 
              }
              
          public native void sayHello(String who);
             

          }


          在這里我們可以看到,我們定義了一個native的方法,叫sayHello,它接受一個String做為參數,我們編譯一下這個文件,然后轉到此工程的build/classes文件夾下面,執行如下命令:
          javah testnative1.Main
          如果正常的話,就會在你運行命令的目錄下產生一個testnative1_Main.h的文件。至此,我們JAVA部份的工作就告一段落了。

          然后我們新建一個C/C++的工程,選擇C/C++ Dynamic Library。意思是動態鏈接庫。工程名就叫Hello吧。

          打開這個工程,在Header Files節點下,建一個C++的頭文件,就叫HelloH.h吧。進入這個文件以后,我們把剛剛生成的testnative1_Main.h內容復制到它里面去。 這樣頭文件就建好了。然后再在Source Files節點下,建一個Empty C++ File。把如下的內容復制過去:

          #include <jni.h>
          #include 
          <stdio.h>
          #include 
          "HelloH.h"
          JNIEXPORT 
          void JNICALL Java_testnative1_Main_sayHello
                  (JNIEnv 
          * env, jobject obj, jstring s){
              
          const char* who;
              who
          =env->GetStringUTFChars(s, 0);
              printf(
          "你好:%s", who);
              env
          ->ReleaseStringUTFChars(s,who);
          }



          這個時候,你會發現很多錯誤提示,別急,我們一個一個來解決,首先對著你的Hello工程點右鍵,然后再點Properties。找到如圖所示的地方,添加我們的引用的頭文件,這個引用是SUN公司給我們定義好的頭文件,就是供我們開發JNI的時候用的。



          這里有一點要注意的就是,不要直接引用到JDK里面的頭文件,最好是把它里面的include文件夾拷出來,因為我們默認安裝的java是裝在C:\program files下面的,因為有空格,所以cygwin將不能識別,在我這里我是把它拷出來放在D盤的根目錄下。然后再找到Command Line這個地方,加上如下的幾個命令:
          -mno-cygwin -Wl,--add-stdcall-alias -shared -m32

          至此,我們的事情就完成了大部份了,然后我們編譯生成整個Hello工程就可以了,如果不出意外的話,就可以在dist目錄下面找到一個叫cygHello.dll的文件,我們把這個文件拷到我們的TestNative工程的根目錄下,執行一下我們的Main類,發現了沒有,我們的native方法 有輸出了。我們現在只是生成了一個在windows下面使用的動態鏈接庫,如果我們要生成能在linux,Mac ,Solaries平臺下的呢。別急,有cygwin,一切都可以搞定了。我們要生成別的平臺的庫文件,只要在General里面選中相應的平臺就可以了。不過最好的辦法還是去相應的平臺下載cygwin,然后再重新用我們這個工程,經過少量的改動,重新生成一下,只需要改動的地方有,include要改一下,因為在windows下面我們include的目錄和linux當然不一樣。還有就是在linux下面編譯的時候,不再需要-mno-cygwin -Wl,--add-stdcall-alias -shared -m32這個命令了。直接生成就可以了,在linux下面會生成一個叫libHello.so的文件,我們JAVA代碼只要導入Hello就可以了,lib的前綴不需要再導入了,因為linux下面庫文件都是帶lib前綴的。

          我這里用的linux環境是ubuntu,一切都正常,在ubuntu下可以看到正常的輸出。只是你一樣要把它放到java.library.path里面去,這樣JVM才能找得到它。構建跨平臺的jni并不是一件非常容易的事情,但是從一個小小的例子可以看出JNI方面的一些東西。祝大家玩得愉快。





          盡管千里冰封
          依然擁有晴空

          你我共同品味JAVA的濃香.
          posted on 2007-10-20 10:09 千里冰封 閱讀(2135) 評論(1)  編輯  收藏 所屬分類: JAVASE

          FeedBack:
          # re: 構建跨平臺的JNI實現(下)
          2007-10-20 18:26 | 海邊沫沫
          沙發  回復  更多評論
            
          主站蜘蛛池模板: 墨竹工卡县| 潢川县| 黄梅县| 苏尼特右旗| 通河县| 大厂| 天气| 新郑市| 普安县| 张北县| 鄂托克旗| 手机| 大悟县| 美姑县| 象州县| 梁河县| 墨竹工卡县| 闻喜县| 孟连| 佛学| 托克逊县| 凉山| 深圳市| 汤阴县| 晋中市| 罗甸县| 句容市| 宿州市| 堆龙德庆县| 遂溪县| 马公市| 宜昌市| 宁海县| 平武县| 如东县| 惠安县| 长寿区| 大竹县| 两当县| 正定县| 丰镇市|