好的一種Java程序調(diào)用C/C++語言函數(shù)的方法
(作者未知) 2011/6/21
[摘要]本文介紹如何利用Java提供的C語言接口在Java中調(diào)用C函數(shù),解決了在實際調(diào)用過程中可能碰到的技術問題,并通過實例給出了具體編程方法。
[關鍵詞]Java JNT C DLL
在現(xiàn)今的軟件開發(fā)領域中,Java以其跨平臺的優(yōu)勢得到大量的應用,其代碼可以一次編譯多處執(zhí)行。但這種特性給Java帶來了一定的局限性,幸好Java提供了完備的C/C++語言接口,這樣我們可以利用C語言的強大功能實現(xiàn)Java難以實現(xiàn)的功能,在一定程序上消除Java的局限性和低效率。
一、創(chuàng)建DLL文件
使用某一種C/C++開發(fā)工具創(chuàng)建Dll文件,實現(xiàn)某一功能,供JAVA調(diào)用,例如本文在此使用Visual studio 2005創(chuàng)建一個名為testdll的動態(tài)庫文件。
二、使用JNI
JNI是Java Native Interface的縮寫,中文為JAVA本地調(diào)用。它允許Java代碼和其他語言寫的代碼進行交互。
1.JAVA類
在JAVA程序中,首先需要在類中聲明所調(diào)用的庫名稱,如下:
static {
System.loadLibrary(“testdll”); //加載動態(tài)庫,testdll為DLL文件名稱
}
還需要對將要調(diào)用的方法做本地聲明,關鍵字為native。并且只需要聲明,而不需要具體實現(xiàn)。如下:
public native static void set(int i);
public native static int get();
然后編譯該JAVA程序文件,生成CLASS,再用JAVAH命令,JNI就會生成C/C++的頭文件。
例如程序testdll.java,內(nèi)容為:
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編譯它,會生成testdll.class。
再用javah testdll,則會在當前目錄下生成testdll.h文件,這個文件需要被C/C++程序調(diào)用來生成所需的庫文件。
2.C/C++
創(chuàng)建C/C++項目需要增加的頭文件有jni.h、jni_md.h這兩個文件是JNI中必須的;還有就是增加testdll.h。
對于已生成的.h頭文件,C/C++所需要做的,就是把它的各個方法具體的實現(xiàn)。然后編譯連接成庫文件即可。再把庫文件拷貝到JAVA程序的路徑下面,就可以用JAVA調(diào)用C/C++所實現(xiàn)的功能了。
接上例子。我們先看一下testdll.h文件的內(nèi)容:
#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
在具體實現(xiàn)的時候,我們只關心兩個函數(shù)原型 JNIEXPORT jint JNICALL Java_testdll_get (JNIEnv *, jclass);和 JNIEXPORT void JNICALL Java_testdll_set (JNIEnv *, jclass, jint);這里JNIEXPORT和JNICALL都是JNI的關鍵字,表示此函數(shù)是要被JNI調(diào)用的。而jint是以JNI為中介使JAVA的int類型與本地的int溝通的一種類型,我們可以視而不見,就當做int使用。函數(shù)的名稱是JAVA_再加上java程序的package路徑再加函數(shù)名組成的。參數(shù)中,我們也只需要關心在JA(未完,下一頁)
|