diff --git a/modules/core/misc/java/src/java/core+Mat.java b/modules/core/misc/java/src/java/core+Mat.java index 6db255417ccabaca94a561ea2ac030ee033a3b17..98cdba97366d782428b73d0fa4dac634be21b8d3 100644 --- a/modules/core/misc/java/src/java/core+Mat.java +++ b/modules/core/misc/java/src/java/core+Mat.java @@ -1,5 +1,7 @@ package org.opencv.core; +import java.nio.ByteBuffer; + // C++: class Mat //javadoc: Mat public class Mat { @@ -39,6 +41,19 @@ public class Mat { return; } + // + // C++: Mat::Mat(int rows, int cols, int type, void* data) + // + + // javadoc: Mat::Mat(rows, cols, type, data) + public Mat(int rows, int cols, int type, ByteBuffer data) + { + + nativeObj = n_Mat(rows, cols, type, data); + + return; + } + // // C++: Mat::Mat(Size size, int type) // @@ -1101,6 +1116,9 @@ public class Mat { // C++: Mat::Mat(int rows, int cols, int type) private static native long n_Mat(int rows, int cols, int type); + // C++: Mat::Mat(int rows, int cols, int type, void* data) + private static native long n_Mat(int rows, int cols, int type, ByteBuffer data); + // C++: Mat::Mat(Size size, int type) private static native long n_Mat(double size_width, double size_height, int type); diff --git a/modules/core/misc/java/test/MatTest.java b/modules/core/misc/java/test/MatTest.java index 3ff0c8be0728c8ba9e28474e5891c7b875f7cd3d..7d0731aa716915a04a14e9d8a0923be044191820 100644 --- a/modules/core/misc/java/test/MatTest.java +++ b/modules/core/misc/java/test/MatTest.java @@ -1,6 +1,7 @@ package org.opencv.test.core; import java.util.Arrays; +import java.nio.ByteBuffer; import org.opencv.core.Core; import org.opencv.core.CvException; @@ -1001,4 +1002,16 @@ public class MatTest extends OpenCVTestCase { assertMatEqual(truth, dst); } + public void testMatFromByteBuffer() { + ByteBuffer bbuf = ByteBuffer.allocateDirect(64*64); + bbuf.putInt(0x01010101); + Mat m = new Mat(64,64,CvType.CV_8UC1,bbuf); + assertEquals(4, Core.countNonZero(m)); + Core.add(m, new Scalar(1), m); + assertEquals(4096, Core.countNonZero(m)); + m.release(); + assertEquals(2, bbuf.get(0)); + assertEquals(1, bbuf.get(4095)); + } + } diff --git a/modules/java/generator/src/cpp/Mat.cpp b/modules/java/generator/src/cpp/Mat.cpp index c85a3d74007a444ecee5effe123fc9e9ccb0904b..6122a7e1e3d7e291a15bd2aaffa280ac419c3000 100644 --- a/modules/java/generator/src/cpp/Mat.cpp +++ b/modules/java/generator/src/cpp/Mat.cpp @@ -51,6 +51,31 @@ JNIEXPORT jlong JNICALL Java_org_opencv_core_Mat_n_1Mat__ +// +// Mat::Mat(int rows, int cols, int type, void* data) +// + +JNIEXPORT jlong JNICALL Java_org_opencv_core_Mat_n_1Mat__IIILjava_nio_ByteBuffer_2 + (JNIEnv* env, jclass, jint rows, jint cols, jint type, jobject data); + +JNIEXPORT jlong JNICALL Java_org_opencv_core_Mat_n_1Mat__IIILjava_nio_ByteBuffer_2 + (JNIEnv* env, jclass, jint rows, jint cols, jint type, jobject data) +{ + static const char method_name[] = "Mat::n_1Mat__IIILByteBuffer()"; + try { + LOGD("%s", method_name); + return (jlong) new Mat( rows, cols, type, (void*)env->GetDirectBufferAddress(data) ); + } catch(const std::exception &e) { + throwJavaException(env, &e, method_name); + } catch (...) { + throwJavaException(env, 0, method_name); + } + + return 0; +} + + + // // Mat::Mat(int rows, int cols, int type) //