- 相關(guān)推薦
Java程序如何調用C/C++語(yǔ)言函數
導語(yǔ):我們可以利用C語(yǔ)言的強大功能實(shí)現Java難以實(shí)現的功能,在一定程序上消除Java的局限性和低效率。 下面就由小編為大家介紹一下Java程序如何調用C/C++語(yǔ)言函數,歡迎大家閱讀!
JNI是Java Native Interface的英文縮寫(xiě),中文翻譯為本地調用,自從Java 1.1開(kāi)始就成為了Java標準的一部分。
C/C++是系統級的編程語(yǔ)言,可以用來(lái)開(kāi)發(fā)任何和系統相關(guān)的程序和類(lèi)庫, 但是Java本身編寫(xiě)底層的應用比較難實(shí)現,使用JNI可以調用現有的本地庫,極大地靈活了Java的開(kāi)發(fā)。
C/C++的效率是目前最好的語(yǔ)言,可以使用C/C++來(lái)實(shí)現一些實(shí)時(shí)性非常高的部分。 C/C++和Java本身都是非常流行的編程語(yǔ)言,一些大型軟件中經(jīng)常使用語(yǔ)言之間的混合編程。
一、創(chuàng )建DLL文件
使用某一種C/C++開(kāi)發(fā)工具創(chuàng )建Dll文件,實(shí)現某一功能,供JAVA調用,例如本文在此使用Visual studio 2005創(chuàng )建一個(gè)名為testdll的動(dòng)態(tài)庫文件。
二、使用JNI
JNI是Java Native Interface的縮寫(xiě),中文為JAVA本地調用。它允許Java代碼和其他語(yǔ)言寫(xiě)的代碼進(jìn)行交互。
1.JAVA類(lèi)
在JAVA程序中,首先需要在類(lèi)中聲明所調用的庫名稱(chēng),如下:
static {
System.loadLibrary(“testdll”); //加載動(dòng)態(tài)庫,testdll為DLL文件名稱(chēng)
}
還需要對將要調用的方法做本地聲明,關(guān)鍵字為native。并且只需要聲明,而不需要具體實(shí)現。如下:
public native static void set(int i);
public native static int get();
然后編譯該JAVA程序文件,生成CLASS,再用JAVAH命令,JNI就會(huì )生成C/C++的頭文件。
例如程序testdll.java,內容為:
public class testdll { static { System.loadLibrary(“testdll”); } public native static int get(); public native static void set(int i); public static void main(String[] args) { testdll test = new testdll(); test.set(10); System.out.println(test.get()); } }
用javac testdll.java編譯它,會(huì )生成testdll.class。
再用javah testdll,則會(huì )在當前目錄下生成testdll.h文件,這個(gè)文件需要被C/C++程序調用來(lái)生成所需的庫文件。
2.C/C++
創(chuàng )建C/C++項目需要增加的頭文件有jni.h、jni_md.h這兩個(gè)文件是JNI中必須的;還有就是增加testdll.h。
對于已生成的.h頭文件,C/C++所需要做的,就是把它的各個(gè)方法具體的實(shí)現。然后編譯連接成庫文件即可。再把庫文件拷貝到JAVA程序的路徑下面,就可以用JAVA調用C/C++所實(shí)現的功能了。
接上例子。我們先看一下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
在具體實(shí)現的時(shí)候,我們只關(guān)心兩個(gè)函數原型 JNIEXPORT jint JNICALL Java_testdll_get (JNIEnv * jclass);和 JNIEXPORT void JNICALL Java_testdll_set (JNIEnv * jclass jint);這里JNIEXPORT和JNICALL都是JNI的關(guān)鍵字,表示此函數是要被JNI調用的。而jint是以JNI為中介使JAVA的int類(lèi)型與本地的int溝通的一種類(lèi)型,我們可以視而不見(jiàn),就當做int使用。函數的名稱(chēng)是JAVA_再加上java程序的package路徑再加函數名組成的。參數中,我們也只需要關(guān)心在JAVA程序中存在的參數,至于JNIEnv*和jclass我們一般沒(méi)有必要去碰它。
下面我們用testdll.cpp文件具體實(shí)現這兩個(gè)函數:#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; }
編譯連接成庫文件,這里就是testdll.dll。把testdll.dll拷貝到testdll.class的目錄下,java testdll運行它,就可以觀(guān)察到結果了。
三、總結
使用JNI可以在JAVA中調用其它語(yǔ)言編寫(xiě)的代碼,在一定程度上消除JAVA的局限性和低效率。
【Java程序如何調用C/C++語(yǔ)言函數】相關(guān)文章:
C++如何調用matlab函數06-29
如何在C/C++中調用Java08-17
C/C++函數調用的方式07-29
C++調用C函數的方法05-21
java調用c函數的實(shí)例09-16
C/C++函數調用的方式有哪些06-23
C語(yǔ)言函數的遞歸調用08-26
C語(yǔ)言函數的運用及調用10-09