背景
在做的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++代码
参考文章
https://blog.csdn.net/z695516174/article/details/82903022 (Opencv在VS2015下的配置)
https://blog.csdn.net/z695516174/article/details/82805877 (java调用C++代码)
https://blog.csdn.net/ouyang_peng/article/details/52997698 (该文后面介绍了JNI的命名规则和数据类型)
https://blog.csdn.net/xlxxcc/article/details/51106721 (JNI的数据类型和C++的数据类型之间的转换)