Java如何調(diào)用C++ DLL庫(kù)
最近做了一個(gè)網(wǎng)頁(yè)端人臉識(shí)別的項(xiàng)目,用c++寫(xiě)了人臉識(shí)別的算法,但是在網(wǎng)頁(yè)端要使用java后臺(tái),這其中就涉及到了java調(diào)用dll的問(wèn)題。下面是小編通過(guò)查閱相關(guān)資料,實(shí)現(xiàn)的一個(gè)簡(jiǎn)單例子。
1、第一步,先在Java中新建一個(gè)類(lèi)
如上圖,其中注意這句System.loadLibrary("javaCallcpp");,這就是加載dll文件的代碼了。然后我們需要dll中實(shí)現(xiàn)下面定義的加減乘除方法。
2、編譯文件,文件名為Java2cpp.java,首先編譯成class文件,如果用的是eclipse,這個(gè)文件已經(jīng)自動(dòng)生成了,在工程目錄下的bin文件夾下。用命令行編譯,打開(kāi)cmd窗口,cd到.java文件所在目錄,執(zhí)行命令javac Java2cpp.java,即生成Java2cpp.class
然后執(zhí)行命令javah Java2cpp生成Java2cpp.h頭文件,但是這一步往往會(huì)失敗,另一種方法可以成功,進(jìn)入eclipse項(xiàng)目的目錄,進(jìn)入bin文件夾,執(zhí)行命令javah -classpath . -jni 包名.類(lèi)名(com.test.jni.Java2cpp),然后生成了com_test_jni_Java2cpp.h
3、在VS中新建項(xiàng)目win32項(xiàng)目,命名為:TestJNI第二步選擇如下:
4、把第二步生成的頭文件拷進(jìn)項(xiàng)目文件夾,然后導(dǎo)入。
5、實(shí)現(xiàn)頭文件中的方法:
(1)新建頭文件dllApi.h,代碼如下:
#include "com_test_jni_Java2cpp.h" int DLL_API_ADD(int a, int b); int DLL_API_SUB(int a, int b); int DLL_API_MUL(int a, int b); int DLL_API_DIV(int a, int b);
(2)新建dllApi.cpp實(shí)現(xiàn)上述方法,代碼如下:
#include "stdafx.h" #include <iostream> #include "dllApi.h" 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); }
(3)在TestJNI.cpp中添加代碼實(shí)現(xiàn)com_test_jni_Java2cpp.h方法,添加完之后代碼如下:
// TestJNI.cpp : 定義 DLL 應(yīng)用程序的導(dǎo)出函數(shù)。 // #include "stdafx.h" #include "TestJNI.h" #include "com_test_jni_Java2cpp.h" #include "dllApi.h" // 這是導(dǎo)出變量的一個(gè)示例 TESTJNI_API int nTestJNI=0; // 這是導(dǎo)出函數(shù)的一個(gè)示例。 TESTJNI_API int fnTestJNI(void) { return 42; } // 這是已導(dǎo)出類(lèi)的構(gòu)造函數(shù)。 // 有關(guān)類(lèi)定義的信息,請(qǐng)參閱 TestJNI.h CTestJNI::CTestJNI() { return; } JNIEXPORT jint JNICALL Java_com_test_jni_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_com_test_jni_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_com_test_jni_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_com_test_jni_Java2cpp_DLL_1DIV(JNIEnv *env, jobject obj, jint a, jint b){ int var = 0; var = DLL_API_DIV(a, b); return var; }
(4)生成dll,在項(xiàng)目文件夾下的Debug文件夾內(nèi)可以找到TestJNI.dll,但是因?yàn)槲覀冊(cè)贘ava里要求dll名為JavaCallcpp,所以此時(shí)把項(xiàng)目重命名為JavaCallcpp,然后重新生成JavaCallcpp。【這一步生成會(huì)失敗,按照如下添加路徑】
6 調(diào)用方法
把第五步生成的JavaCallcpp.dll拷進(jìn)JRE安裝路徑下的bin文件夾內(nèi),運(yùn)行java程序即可。結(jié)果如下:
以上所述是小編給大家介紹的Java如何調(diào)用C++ DLL庫(kù)的全部敘述,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
MyBatis標(biāo)簽之Select?resultType和resultMap詳解
這篇文章主要介紹了MyBatis標(biāo)簽之Select?resultType和resultMap,在MyBatis中有一個(gè)ResultMap標(biāo)簽,它是為了映射select標(biāo)簽查詢(xún)出來(lái)的結(jié)果集,下面使用一個(gè)簡(jiǎn)單的例子,來(lái)介紹 resultMap 的使用方法,需要的朋友可以參考下2022-09-09Java數(shù)據(jù)結(jié)構(gòu)之鏈表、棧、隊(duì)列、樹(shù)的實(shí)現(xiàn)方法示例
這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)之鏈表、棧、隊(duì)列、樹(shù)的實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了Java數(shù)據(jù)結(jié)構(gòu)中鏈表、棧、隊(duì)列、樹(shù)的功能、定義及使用方法,需要的朋友可以參考下2019-03-03Mybatis-plus多租戶(hù)項(xiàng)目實(shí)戰(zhàn)進(jìn)階指南
多租戶(hù)是一種軟件架構(gòu)技術(shù),在多用戶(hù)的環(huán)境下共有同一套系統(tǒng),并且要注意數(shù)據(jù)之間的隔離性,下面這篇文章主要給大家介紹了關(guān)于Mybatis-plus多租戶(hù)項(xiàng)目實(shí)戰(zhàn)進(jìn)階的相關(guān)資料,需要的朋友可以參考下2022-02-02java 實(shí)現(xiàn)文件夾的拷貝實(shí)例代碼
這篇文章主要介紹了java 實(shí)現(xiàn)文件夾的拷貝實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-04-04Java實(shí)現(xiàn)字符數(shù)組全排列的方法
這篇文章主要介紹了Java實(shí)現(xiàn)字符數(shù)組全排列的方法,涉及Java針對(duì)字符數(shù)組的遍歷及排序算法的實(shí)現(xiàn)技巧,需要的朋友可以參考下2015-12-12使用Swagger時(shí)Controller中api接口顯示不全的問(wèn)題分析及解決
swagger是一個(gè)十分好用的api接口管理、測(cè)試框架,現(xiàn)在越來(lái)越多的人使用這個(gè)做接口的測(cè)試和管理,但經(jīng)常遇到Controller中的api接口顯示不全的問(wèn)題,所以本文給大家詳細(xì)分析了問(wèn)題以及解決方法,需要的朋友可以參考下2024-02-02Java elasticSearch-api的具體操作步驟講解
這篇文章主要介紹了elasticSearch-api的具體操作步驟講解,本文通過(guò)詳細(xì)的步驟介紹和圖文代碼展示講解了該項(xiàng)技術(shù),需要的朋友可以參考下2021-06-06