java調用c語言編寫的方法---本地方法篇之java中的native關鍵字


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 ..

 6.執行編譯后的java類文件MyNative.class

結果為:

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM