天天看點

java調用C++ DLL庫方法

最近一個項目要開發網頁端人臉識别項目,人臉識别的算法已經寫好,是C++版,但是網頁端要求使用Java背景,這就涉及到Java調用DLL的問題。經過查找,實作了一個簡單的例子。

1、第一步,先在Java中建立一個類

java調用C++ DLL庫方法

如上圖,其中注意這句System.loadLibrary("javaCallcpp");,這就是加載dll檔案的代碼了。然後我們需要dll中實作下面定義的加減乘除方法。

2、編譯檔案,檔案名為Java2cpp.java,首先編譯成class檔案,如果用的是eclipse,這個檔案已經自動生成了,在工程目錄下的bin檔案夾下。用指令行編譯,打開cmd視窗,cd到.java檔案所在目錄,執行指令javac Java2cpp.java,即生成Java2cpp.class

然後執行指令javah Java2cpp生成Java2cpp.h頭檔案,但是這一步往往會失敗,另一種方法可以成功,進入eclipse項目的目錄,進入bin檔案夾,執行指令javah -classpath . -jni 包名.類名(com.test.jni.Java2cpp),然後生成了com_test_jni_Java2cpp.h

3、在VS中建立項目win32項目,命名為:TestJNI第二步選擇如下:

java調用C++ DLL庫方法

4、把第二步生成的頭檔案拷進項目檔案夾,然後導入。

5、實作頭檔案中的方法:

(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實作上述方法,代碼如下:

java調用C++ DLL庫方法
#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);
}      
java調用C++ DLL庫方法

(3)在TestJNI.cpp中添加代碼實作com_test_jni_Java2cpp.h方法,添加完之後代碼如下:

java調用C++ DLL庫方法
// TestJNI.cpp : 定義 DLL 應用程式的導出函數。
//

#include "stdafx.h"
#include "TestJNI.h"
#include "com_test_jni_Java2cpp.h"
#include "dllApi.h"
// 這是導出變量的一個示例
TESTJNI_API int nTestJNI=0;

// 這是導出函數的一個示例。
TESTJNI_API int fnTestJNI(void)
{
  return 42;
}

// 這是已導出類的構造函數。
// 有關類定義的資訊,請參閱 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;
}      
java調用C++ DLL庫方法

(4)生成dll,在項目檔案夾下的Debug檔案夾内可以找到TestJNI.dll,但是因為我們在Java裡要求dll名為JavaCallcpp,是以此時把項目重命名為JavaCallcpp,然後重新生成JavaCallcpp。【這一步生成會失敗,按照如下添加路徑】

java調用C++ DLL庫方法

6 調用方法

把第五步生成的JavaCallcpp.dll拷進JRE安裝路徑下的bin檔案夾内,運作java程式即可。結果如下:

java調用C++ DLL庫方法