當前位置:才華齋>計算機>java語言>

Java程式如何呼叫C/C++語言函式

java語言 閱讀(2.04W)

導語:我們可以利用C語言的強大功能實現Java難以實現的功能,在一定程式上消除Java的侷限性和低效率。 下面就由小編為大家介紹一下Java程式如何呼叫C/C++語言函式,歡迎大家閱讀!

Java程式如何呼叫C/C++語言函式

JNI是Java Native Interface的英文縮寫,中文翻譯為本地呼叫,自從Java 1.1開始就成為了Java標準的一部分。

C/C++是系統級的程式語言,可以用來開發任何和系統相關的程式和類庫, 但是Java本身編寫底層的應用比較難實現,使用JNI可以呼叫現有的'本地庫,極大地靈活了Java的開發。

C/C++的效率是目前最好的語言,可以使用C/C++來實現一些實時性非常高的部分。 C/C++和Java本身都是非常流行的程式語言,一些大型軟體中經常使用語言之間的混合程式設計。

  一、建立DLL檔案

使用某一種C/C++開發工具建立Dll檔案,實現某一功能,供JAVA呼叫,例如本文在此使用Visual studio 2005建立一個名為testdll的動態庫檔案。

  二、使用JNI

JNI是Java Native Interface的縮寫,中文為JAVA本地呼叫。它允許Java程式碼和其他語言寫的程式碼進行互動。

在JAVA程式中,首先需要在類中宣告所呼叫的庫名稱,如下:

static {

Library(“testdll”); //載入動態庫,testdll為DLL檔名稱

}

還需要對將要呼叫的方法做本地宣告,關鍵字為native。並且只需要宣告,而不需要具體實現。如下:

public native static void set(int i);

public native static int get();

然後編譯該JAVA程式檔案,生成CLASS,再用JAVAH命令,JNI就會生成C/C++的標頭檔案。

例如程式,內容為:

public class testdll { static { Library(“testdll”); } public native static int get(); public native static void set(int i); public static void main(String[] args) { testdll test = new testdll(); (10); tln(()); } }

用javac 編譯它,會生成s。

再用javah testdll,則會在當前目錄下生成testdll.h檔案,這個檔案需要被C/C++程式呼叫來生成所需的庫檔案。

2.C/C++

建立C/C++專案需要增加的標頭檔案有jni.h、jni_md.h這兩個檔案是JNI中必須的;還有就是增加testdll.h。

對於已生成的.h標頭檔案,C/C++所需要做的,就是把它的各個方法具體的實現。然後編譯連線成庫檔案即可。再把庫檔案拷貝到JAVA程式的路徑下面,就可以用JAVA呼叫C/C++所實現的功能了。

接上例子。我們先看一下testdll.h檔案的內容:

#include #ifndef _Included_testdll #define _Included_testdll #ifdef __cplusplus extern "C" { #endif JNIEXPORT jint JNICALL Java_testdll_get (JNIEnv * jclass); 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我們一般沒有必要去碰它。

下面我們用檔案具體實現這兩個函式:#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+5; }

編譯連線成庫檔案,這裡就是。把拷貝到s的目錄下,java testdll執行它,就可以觀察到結果了。

  三、總結

使用JNI可以在JAVA中呼叫其它語言編寫的程式碼,在一定程度上消除JAVA的侷限性和低效率。