native關鍵字
native是一個計算機函數,它修飾的方法就是一個非java代碼的接口,方法的具體實現並不是java,而是由其他語言(比如c或者c++)。Java語言本身不能對操作系統底層進行訪問和操作,但是可以通過JNI接口調用其他語言來實現對底層的訪問。
JNI是Java本機接口(Java Native Interface),是一個本機編程接口,它是Java軟件開發工具箱(Java Software Development Kit,SDK)的一部分。JNI允許Java代碼使用以其他語言編寫的代碼和代碼庫。Invocation API(JNI的一部分)可以用來將Java虛擬機(JVM)嵌入到本機應用程序中,從而允許程序員從本機代碼內部調用Java代碼
關於native更多了解,可以去百度。下面我將在windows平台演示一個java調用本地方法的例子,為什么要說平台呢,因為不同平台的動態鏈接庫的文件不一樣,比如說windows是后綴為“.dll”的文件,而linux平台是“lib****.so”...
本例環境:
windows7 64位
jdk 32位
Microsoft Visual C++環境
1.創建MyNative java類
1 public class MyNative 2 { 3 public void showParms( String s, int i, boolean b ) 4 { 5 showParms0( s, i , b ); 6 } 7 private native void showParms0( String s, int i, boolean b );//定義本地方法 8 static 9 { 10 System.loadLibrary( "MyNative" );//靜態加載MyNative.dll 11 } 12 public static void main( String[] args ) 13 { 14 MyNative obj = new MyNative(); 15 obj.showParms( "Hello", 23, true );//測試本地方法 16 obj.showParms( "World", 34, false ); 17 } 18 }
2.編譯類

3.生成.h頭文件

會生成MyNative.h文件,內容如下:
1 /* DO NOT EDIT THIS FILE - it is machine generated */ 2 #include <jni.h> 3 /* Header for class MyNative */ 4 5 #ifndef _Included_MyNative 6 #define _Included_MyNative 7 #ifdef __cplusplus 8 extern "C" { 9 #endif 10 /* 11 * Class: MyNative 12 * Method: showParms0 13 * Signature: (Ljava/lang/String;IZ)V 14 */ 15 JNIEXPORT void JNICALL Java_MyNative_showParms0 16 (JNIEnv *, jobject, jstring, jint, jboolean); 17 18 #ifdef __cplusplus 19 } 20 #endif 21 #endif
第一個參數是調用 JNI 方法時使用的 JNI Environment 指針。第二個參數是指向在此 Java 代碼中實例化的 Java 對象 MyNative 的一個句柄。其他參數是方法本身的參數。請注意,MyNative.h 包括頭文件 jni.h。jni.h 包含 JNI API 和變量類型(包括jobject、jstring、jint、jboolean,等等)的原型和其他聲明。
4.編寫c語言類文件MyNative.c
1 #include <stdio.h> 2 #include "MyNative.h" 3 JNIEXPORT void JNICALL Java_MyNative_showParms0 4 (JNIEnv *env, jobject obj, jstring s, jint i, jboolean b) 5 { 6 const char* szStr = (*env)->GetStringUTFChars( env, s, 0 ); 7 printf( "String = [%s]\n", szStr );//打印參數s 8 printf( "int = %d\n", i ); 9 printf( "boolean = %s\n", (b==JNI_TRUE ? "true" : "false") ); 10 (*env)->ReleaseStringUTFChars( env, s, szStr ); 11 }
5.生成.dll文件(這里用到cl命令,所以需要Microsoft Visual C++環境)

說明:這里的d:/java是我的jdk的位置,MyNative.c是要編譯的文件,MyNtive.dll是生成的dll文件名。
注意:注意保持jvm的位數和Microsoft Visual C++生成的dll文件位數一致,否則會拋出異常:
Can't load IA 64-bit .dll on a AMD 64-bit ..

結果為:
這樣就簡單完成了java調用本地方法。當然,在eclipse中及各種也可以像這樣調用本地方法,具體怎么實現,大家可以自己去試試調用各種各樣的方法,比如說有返回值的方法,static修飾的方法等。
