如果輸出類似如下的話,就說明安裝正確了:
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);
}
* 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);
}
#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的濃香.