Java程序調用C/C++語言函數的方法

導語:Java提供了完備的C/C++語言接口,這樣我們可以利用C語言的強大功能實現Java難以實現的功能,在一定程序上消除Java的侷限性和低效率。 下面就由小編爲大家介紹一下Java程序調用C/C++語言函數的方法,歡迎大家閱讀!

Java程序調用C/C++語言函數的方法

  一、創建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使用。函數的名稱是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的侷限性和低效率。