Java程序如何調用C/C++語言函數
導語:我們可以利用C語言的強大功能實現Java難以實現的功能,在一定程序上消除Java的侷限性和低效率。 下面就由小編為大家介紹一下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的侷限性和低效率。
-
Java語言中substr和substring的區別
由於在項目中有需要對字符串進行截取,然後手殘使用了IDE自動提示的substr,沒想那麼多以為substr和substring沒多大區別。然而並不是,且聽我一一道來。1.substr(index,length)從起始索引號提取字符串中指定數目的`字符。substr方法可以傳入兩個參數index和length。...
-
Java中基於Aspectwerkz的AOP開發
一、AOP編程概覽面向對象編程技術進入軟件開發的主流對軟件的開發方式產生了極大的影響,開發者可以用一組實體以及這些實體之間的關係將系統形象地表示出來,這使得他們能夠設計出規模更大、更復雜的系統,開發週期也比以前更短。OO開發的唯一問題是,它本質上是靜態...
-
計算機二級JAVA考試強化訓練題(單選)
為幫助考生們更快第掌握二級JAVA相應知識點,以下是本站小編搜索整理的一份計算機二級JAVA考試強化訓練題(單選),供參考練習,預祝考生們考出自己理想的成績!想了解更多相關信息請持續關注我們應屆畢業生考試網!單選題1).下列關於Applet的安全限制的敍述中,錯誤的是(...
-
java設計模式:工廠模式
導語:Java是一門面向對象編程語言,不僅吸收了C++語言的各種優點,還摒棄了C++裏難以理解的多繼承、指針等概念,因此Java語言具有功能強大和簡單易用兩個特徵。下面我們來看看工廠模式,希望對大家有所幫助。工廠設計模式★場景和問題面向接口編程是java編程中的大家所...