您好,登錄后才能下訂單哦!
由于項(xiàng)目的需要,最近研究了java 調(diào)用DLL的方法,將如何調(diào)用的寫(xiě)于此,便于日后查閱:
采用的方法是JNI: Java Native Interface,簡(jiǎn)稱JNI,是Java平臺(tái)的一部分,可用于讓Java和其他語(yǔ)言編寫(xiě)的代碼進(jìn)行交互。
下面是從網(wǎng)上摘取的JNI工作示意圖:
總體說(shuō)明:先在JAVA中建立一個(gè)類,通過(guò)javac生成.class,再由javah生成.h;然后將.h復(fù)制到VC下,由VC實(shí)現(xiàn)具體函,
并編譯通過(guò)后生成DLL,將DLL放入JAVA工程中使用,完畢。
下面說(shuō)說(shuō)具體步驟(含實(shí)例):
1、建java類:裝載DLL,聲明要使用DLL方法,具體實(shí)現(xiàn)由DLL負(fù)責(zé);代碼如下:
public class Java2cpp { static { System.loadLibrary("javaCallcpp"); } public native int DLL_ADD(int a,int b); //加 public native int DLL_SUB(int a,int b); //減 public native int DLL_MUL(int a,int b); //乘 public native int DLL_DIV(int a,int b); //除 public static void main(String args[]) { int sum = 0; Java2cpp test = new Java2cpp(); sum = test.DLL_ADD(2, 4); System.out.println("Java call cpp dll result:" + sum); } }
2、生成.h文件:cmd 到Java2cpp.java目錄下,做如下操作:
第一步:javac Java2cpp.java 生成java2cpp.class
第二步:javah Java2cpp 生成Java2cpp.h頭文件,內(nèi)容如下:
注意:Java2cpp.h這個(gè)頭文件的內(nèi)容是不能修改的,否則會(huì)出錯(cuò)。
3、制做VC動(dòng)態(tài)庫(kù): 創(chuàng)建一個(gè)C/C++動(dòng)態(tài)庫(kù)工程,命名為javaCallcpp,導(dǎo)入java2cpp.h并實(shí)現(xiàn)其方法:
#include "Java2cpp.h" #include "dllApi.h" JNIEXPORT jint JNICALL Java_Java2cpp_DLL_1ADD(JNIEnv *env, jobject obj, jint a, jint b) { int var = 0; var = DLL_API_ADD(a,b); return var; } JNIEXPORT jint JNICALL Java_Java2cpp_DLL_1SUB(JNIEnv *env, jobject obj, jint a, jint b) { int var = 0; var = DLL_API_SUB(a,b); return var; } JNIEXPORT jint JNICALL Java_Java2cpp_DLL_1MUL(JNIEnv *env, jobject obj, jint a, jint b) { int var = 0; var = DLL_API_MUL(a,b); return var; } JNIEXPORT jint JNICALL Java_Java2cpp_DLL_1DIV(JNIEnv *env, jobject obj, jint a, jint b) { int var = 0; var = DLL_API_DIV(a,b); return var; } //此文件完
加DLL_API_ADD()、減DLL_API_SUB()、乘DLL_API_MUL()、除DLL_API_DIV()四個(gè)函數(shù)在別一個(gè)
文件中實(shí)現(xiàn),文件名是dllApi.cpp,實(shí)現(xiàn)如下:
int DLL_API_ADD(int a,int b) { return (a+b); } int DLL_API_SUB(int a,int b) { return (a-b); } int DLL_API_MUL(int a,int b) { return (a*b); } int DLL_API_DIV(int a,int b) { return (a/b); } //此文件完
此時(shí)工程還編譯不過(guò),因?yàn)閕nclude<jni.h>出錯(cuò),需添加JNI所在的目錄,如下:
4、編譯動(dòng)態(tài)庫(kù)工程:生成javaCallcpp.dll,并將這個(gè)動(dòng)態(tài)庫(kù)復(fù)制到j(luò)ava工程目錄下:
5、使用DLL:運(yùn)行java程序,結(jié)果如下:
至此,java調(diào)用dll已經(jīng)完成。
總結(jié)
以上所述是小編給大家介紹的Java通過(guò)調(diào)用C/C++實(shí)現(xiàn)的DLL動(dòng)態(tài)庫(kù)——JNI的方法,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)億速云網(wǎng)站的支持!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。