Java通過調(diào)用C/C++實現(xiàn)的DLL動態(tài)庫——JNI的方法
由于項目的需要,最近研究了java 調(diào)用DLL的方法,將如何調(diào)用的寫于此,便于日后查閱:
采用的方法是JNI: Java Native Interface,簡稱JNI,是Java平臺的一部分,可用于讓Java和其他語言編寫的代碼進(jìn)行交互。
下面是從網(wǎng)上摘取的JNI工作示意圖:
總體說明:先在JAVA中建立一個類,通過javac生成.class,再由javah生成.h;然后將.h復(fù)制到VC下,由VC實現(xiàn)具體函,
并編譯通過后生成DLL,將DLL放入JAVA工程中使用,完畢。
下面說說具體步驟(含實例):
1、建java類:裝載DLL,聲明要使用DLL方法,具體實現(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這個頭文件的內(nèi)容是不能修改的,否則會出錯。
3、制做VC動態(tài)庫: 創(chuàng)建一個C/C++動態(tài)庫工程,命名為javaCallcpp,導(dǎo)入java2cpp.h并實現(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()四個函數(shù)在別一個
文件中實現(xiàn),文件名是dllApi.cpp,實現(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);
} //此文件完
此時工程還編譯不過,因為include<jni.h>出錯,需添加JNI所在的目錄,如下:
4、編譯動態(tài)庫工程:生成javaCallcpp.dll,并將這個動態(tài)庫復(fù)制到j(luò)ava工程目錄下:
5、使用DLL:運(yùn)行java程序,結(jié)果如下:
至此,java調(diào)用dll已經(jīng)完成。
總結(jié)
以上所述是小編給大家介紹的Java通過調(diào)用C/C++實現(xiàn)的DLL動態(tài)庫——JNI的方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
關(guān)于Spring @Bean 相同加載順序不同結(jié)果不同的問題記錄
本文主要探討了在Spring 5.1.3.RELEASE版本下,當(dāng)有兩個全注解類定義相同類型的Bean時,由于加載順序不同,最終生成的Bean實例也會不同,文章通過分析ConfigurationClassPostProcessor的執(zhí)行過程,解釋了BeanDefinition的加載和覆蓋機(jī)制,感興趣的朋友一起看看吧2025-02-02
SpringBoot連接MYSQL數(shù)據(jù)庫并使用JPA進(jìn)行操作
今天給大家介紹一下如何SpringBoot中連接Mysql數(shù)據(jù)庫,并使用JPA進(jìn)行數(shù)據(jù)庫的相關(guān)操作。2017-04-04
Java實現(xiàn)的簡單字符串反轉(zhuǎn)操作示例
這篇文章主要介紹了Java實現(xiàn)的簡單字符串反轉(zhuǎn)操作,結(jié)合實例形式分別描述了java遍歷逆序輸出以及使用StringBuffer類的reverse()方法兩種字符串反轉(zhuǎn)操作技巧,需要的朋友可以參考下2018-08-08
Java后端Tomcat實現(xiàn)WebSocket實例教程
WebSocket protocol 是HTML5一種新的協(xié)議。它實現(xiàn)了瀏覽器與服務(wù)器全雙工通信(full-duplex)。一開始的握手需要借助HTTP請求完成握手。本文給大家介紹Java后端Tomcat實現(xiàn)WebSocket實例教程,感興趣的朋友一起學(xué)習(xí)吧2016-05-05

