1. 程式人生 > >為Java專案寫dll庫(Release版)

為Java專案寫dll庫(Release版)

背景

在做的java專案中需要使用的一個方法scan(),在C++中有現成的,由於不能完美重構成java,因此採用dll庫的方式使用之。

環境

Windows8.1

VS2015 Community

Eclipse neon.3

jdk 1.8

流程

1. 根據需求,在test.java檔案中編寫相關方法

package com.imgMatch //注意包路徑,很重要,很重要,很重要!!!!!!!!!!!!!
public class test
{
    static
    {
        System.loadLibrary("JNI_Opencv");//呼叫dll,其名字為JNI_Opencv
    }

    //dll中的方法
    public native void scan(String path,String path1,int des_width,int des_hight);

    public static void main(String[] args)
    {
        …………
        //呼叫該方法
        test tes = new test();
        tes.scan(strFile,desFile,des_width,des_hight);
        …………
    }
}

2. 進入該專案的src檔案下,與test.java同級,編譯出 .class檔案,命令如下:

javac test.java

3. 進入該專案的src檔案下,與com同級,生成 .h檔案,命令如下:

javah -classpath . -jni com.imgMatch.test

4. 將會生成 com_imgMatch_test.h 檔案,這就是我們在C++中要使用的檔案。

5. 開啟VS,新建dll專案,在這裡我的專案命名為 JNI_Opencv,這也就是你生成的dll檔案的名字。

6. 將步驟4中得到的 .h檔案放在你的C++專案的標頭檔案之中。

7. 編寫dllApi.h標頭檔案,名字無所謂,看個人愛好。

在這個標頭檔案裡放入你的原始C++檔案的內容。當然,為了生成Release版本的dll檔案,相應的配置都應該改為Release版本的配置,同時還要注意你的平臺是x64還是x86。

8. 在JNI_Opencv.cpp檔案中實現com_imgMatch_test.h 檔案的方法。


JNIEXPORT void JNICALL Java_imgMatch_test_scan(JNIEnv *env, jobject obj, jstring a,jstring b,int w,int h) {
	scan(x,y,w,h);
}

由於jstring是屬於java的而string是屬於C++,因此需要轉換。方法請見參考文章


JNIEXPORT void JNICALL Java_imgMatch_test_scan(JNIEnv *env, jobject obj, jstring a,jstring b,int w,int h) {
	string x = jstring2str(env,a);
	string y = jstring2str(env,b);
	scan(x,y,w,h);
}

9. 生成dll

10. 帶著我們的dll庫回到java專案,新增dll至我們的專案路徑之中即可。

具體可見參考文章,java呼叫C++程式碼

參考文章