1. 程式人生 > >java呼叫C++ DLL庫方法

java呼叫C++ DLL庫方法

       最近一個專案要開發網頁端人臉識別專案,人臉識別的演算法已經寫好,是C++版,但是網頁端要求使用Java後臺,這就涉及到Java呼叫DLL的問題。經過查詢,實現了一個簡單的例子。

1.第一步,先在Java中新建一個類

package com.test.jni;
public class Java2cpp {
    static {
        System.loadlibrary("javaCllcpp");
    }
    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, ans1 = 0, ans2 = 0, ans3 = 0;
        Java2cpp test = new Java2cpp();

        sum = test.DLL_ADD(2, 4);
        ans1 = test.DLL_SUB(7, 2);
        ans2 = test.DLL_MUL(4, 5);
        ans3 = test.DLL_DIV(9, 3);
        System.out.println("Java call cpp dll result:"+sum+"  "+ans1+"  "+ans2+" "+ans3+"");
    }
}

  如上圖,其中注意這句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第二步選擇如下:

  

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實現上述方法,程式碼如下:

#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中新增程式碼實現com_test_jni_Java2cpp.h方法,新增完之後程式碼如下:

//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;
}

//這是已匯出類的建構函式
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資料夾內可以找到TestJNI.dll,但是因為我們在Java裡要求dll名為JavaCallcpp,所以此時把專案重新命名為JavaCallcpp,然後重新生成JavaCallcpp。【這一步生成會失敗,按照如下新增路徑】

    

6. 呼叫方法

把第五步生成的JavaCallcpp.dll拷進JRE安裝路徑下的bin資料夾內,執行java程式即可。結果如下: