為Java專案寫dll庫(Release版)
阿新 • • 發佈:2018-12-13
背景
在做的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++程式碼