Java如何調(diào)用C++ DLL庫
最近做了一個網(wǎng)頁端人臉識別的項目,用c++寫了人臉識別的算法,但是在網(wǎng)頁端要使用java后臺,這其中就涉及到了java調(diào)用dll的問題。下面是小編通過查閱相關(guān)資料,實現(xiàn)的一個簡單例子。
1、第一步,先在Java中新建一個類

如上圖,其中注意這句System.loadLibrary("javaCallcpp");,這就是加載dll文件的代碼了。然后我們需要dll中實現(xiàn)下面定義的加減乘除方法。
2、編譯文件,文件名為Java2cpp.java,首先編譯成class文件,如果用的是eclipse,這個文件已經(jīng)自動生成了,在工程目錄下的bin文件夾下。用命令行編譯,打開cmd窗口,cd到.java文件所在目錄,執(zhí)行命令javac Java2cpp.java,即生成Java2cpp.class
然后執(zhí)行命令javah Java2cpp生成Java2cpp.h頭文件,但是這一步往往會失敗,另一種方法可以成功,進入eclipse項目的目錄,進入bin文件夾,執(zhí)行命令javah -classpath . -jni 包名.類名(com.test.jni.Java2cpp),然后生成了com_test_jni_Java2cpp.h
3、在VS中新建項目win32項目,命名為:TestJNI第二步選擇如下:

4、把第二步生成的頭文件拷進項目文件夾,然后導(dǎo)入。
5、實現(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實現(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中添加代碼實現(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)出變量的一個示例
TESTJNI_API int nTestJNI=0;
// 這是導(dǎo)出函數(shù)的一個示例。
TESTJNI_API int fnTestJNI(void)
{
return 42;
}
// 這是已導(dǎo)出類的構(gòu)造函數(shù)。
// 有關(guān)類定義的信息,請參閱 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,在項目文件夾下的Debug文件夾內(nèi)可以找到TestJNI.dll,但是因為我們在Java里要求dll名為JavaCallcpp,所以此時把項目重命名為JavaCallcpp,然后重新生成JavaCallcpp?!具@一步生成會失敗,按照如下添加路徑】

6 調(diào)用方法
把第五步生成的JavaCallcpp.dll拷進JRE安裝路徑下的bin文件夾內(nèi),運行java程序即可。結(jié)果如下:

以上所述是小編給大家介紹的Java如何調(diào)用C++ DLL庫的全部敘述,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
Activiti7通過代碼動態(tài)生成工作流實現(xiàn)詳解
這篇文章主要為大家介紹了Activiti7通過代碼動態(tài)生成工作流實現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-11-11
HashMap工作原理_動力節(jié)點Java學(xué)院整理
這篇文章主要介紹了HashMap工作原理_動力節(jié)點Java學(xué)院整理,需要的朋友可以參考下2017-04-04
prometheus監(jiān)控springboot應(yīng)用簡單使用介紹詳解
這篇文章主要介紹了prometheus監(jiān)控springboot應(yīng)用簡單使用介紹詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-05-05
springboot在filter中如何用threadlocal存放用戶身份信息
這篇文章主要介紹了springboot中在filter中如何用threadlocal存放用戶身份信息,本文章主要描述通過springboot的filter類,在過濾器中設(shè)置jwt信息進行身份信息保存的方法,需要的朋友可以參考下2024-07-07
淺析Java類和數(shù)據(jù)結(jié)構(gòu)中常用的方法
下面小編就為大家?guī)硪黄獪\析Java類和數(shù)據(jù)結(jié)構(gòu)中常用的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-09-09

