Java程序調用C/C++語言函數的方法
導語:Java提供了完備的C/C++語言接口,這樣我們可以利用C語言的強大功能實現Java難以實現的功能,在一定程序上消除Java的侷限性和低效率。 下面就由小編爲大家介紹一下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的侷限性和低效率。
相關文章
-
Java程序如何調用C/C++語言函數
人事部是一個企業或者團體的人力資源和企業公共事務的管理部門 。現在爲強化人的重要性,分離出人力資源部門。行政人事部年度工作計劃怎麼寫,我們來看看下文。篇一:行政人事部年度工作計劃怎麼寫根據20XX年工作中存在不 -
c#和javascript函數相互調用示例
在設置過webBrowser控件的ObjectForScripting屬性後,還需要設置應用程序對com可見,不然會拋出一個異常(ObjectForScripting 的類必須對 COM 可見。請確認該對象是公共的,或考慮向您的'類添加 ComVisible 屬性。),可做如下 -
JavaScript中調用函數的4種方式
1:方法調用模式var myObj = {//對象字面量 param1: 1, param2: 2, sum: function (){//this關鍵字只帶當前的對象retu lt = m1 + m2; }}(); //=>32:函數調用模式var add = function(a, b){ retu a + b;}//函數調用模式a -
java調用c函數的實例
從C/C++到Java,再從Java回到C/C++,今天終於有機會了解了連接Java、C/C++的橋樑——JNI。哈哈!分享一下!一、簡介JNI是Java native interface的簡寫,可以譯作Java原生接口。Java可以通過JNI調用C/C++的庫,這對於那些對性能要 -
javascript中的match函數用法簡介
javascript中的match函數是使用正則表達式對字符串進行查找,並將查找的結果作爲數組返回,在實際開發中非常的有用,使用方法如下:h(rgExp)其中stringObj是必選項。對其進行查找的 String 對象或字符串文字。rgExp是必選 -
javascript中各種函數的使用方法
e();Array和String對象都有在Array中 slice(i,[j])i爲開始截取的索引值,負數代表從末尾算起的索引值,-1爲倒數第一個元素j爲結束的索引值,缺省時則獲取從i到末尾的所有元素參數返回:返回索引值從i到j的數組,原數組不改變在St -
javascript數組使用調用方法
JS數組方法彙總shift:刪除原數組第一項,並返回刪除元素的值;如果數組爲空則返回undefinedvara=[1,2,3,4,5];varb=t();//a:[2,3,4,5]b:1unshift:將參數添加到原數組開頭,並返回數組的長度vara=[1,2,3,4,5];varb=ift(-2,-1);// -
最常用的20個javascript方法函數
簡單基礎就可以學會主要材料:畫紙橡皮彩鉛染料所需工具:橡皮炭筆馬克筆彩鉛鉛筆水筆製作步驟:第1步:找出你想要會畫的那張圖片進行繪畫第2步:先用鉛筆畫出大概輪廓,以及第3步:然後又供線筆勾線第4步:在一步一步上色第5步:第6步 -
分析JavaScript函數的調用模式
我們說一個函數的調用模式是作爲一個函數來調用,是要與其它三種調用模式做區分函數其他的三種調用: 方法調用模式,構造器調用模式,apply/call調用模式。方法的調用模式:var obj={ fun1: function(){ //方法內容 this; // -
JavaScript中exec函數用法
本文實例講述了JavaScript中exec函數用法。分享給大家供大家參考。具體如下:javaScript 中的 exec 函數,用正則表達式模式在字符串中運行查找,並返回包含該查找結果的一個數組。(str)參數:rgExp 必選項。包含正則表達式模