为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++代码

参考文章

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++的数据类型之间的转换)

 

猜你喜欢

转载自blog.csdn.net/z695516174/article/details/82917741