idea新建一个java application项目
配置:
idea导入opencv jar包:
①file->Project Structure
②点击+,选择opencv jar包即可
代码实现
src目录下新建package com.jni.test,新建classHelloJNI和call
HelloJNI内容:
package com.jni.test;
public class HelloJNI {
public native static int Test(long imagePtr);
}
通过编译,生成相应的class文件
通过javah生成c++的.h头文件
通过windows命令行,到src目录下,运行
javah com.jni.test.HelloJNI
得到头文件com_jni_test_HelloJNI.h,内容:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_jni_test_HelloJNI */
#ifndef _Included_com_jni_test_HelloJNI
#define _Included_com_jni_test_HelloJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_jni_test_HelloJNI
* Method: TruckStatusTest
* Signature: (JJ[I)I
*/
JNIEXPORT jint JNICALL Java_com_jni_test_HelloJNI_Test
(JNIEnv *, jclass, jlong);
#ifdef __cplusplus
}
#endif
#endif
然后新建cpp,实现相应的函数,内容:
#include "com_jni_test_HelloJNI.h"
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
JNIEXPORT jint JNICALL Java_com_jni_test_HelloJNI_Test(JNIEnv *env, jobject aThis, jlong imagePtr)
{
cv::Mat& image = *(cv::Mat*)imagePtr;
cv::imwrite("test.png", image);
}
利用VS新建test工程,然后生成相应的动态链接库,然后将test.dll放在工程目录下
最后通过类call调用进行,内容:
package com.jni.test;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.dnn.*;
public class call {
static {
System.loadLibrary("opencv_java400");
System.loadLibrary("test");
}
public static void main(String[] args) {
Mat mat = Imgcodecs.imread("D:\\code\\JAVA\\JNI_test\\1.jpg");
HelloJNI hjni = new HelloJNI();
System.out.println(hjni.TruckStatusTest(mat.getNativeObjAddr()));
}
}