From 821fac187c8c509b99f0877b5eacbb6c1b9f64f0 Mon Sep 17 00:00:00 2001
From: Alexander Smorkalov <smorkalov.a.m@gmail.com>
Date: Fri, 29 May 2020 16:20:28 +0300
Subject: [PATCH] Generate constructor with smart pointer, if it's expected.

---
 .../java/test/BruteForceDescriptorMatcherTest.java  | 10 ++++++++++
 .../java/test/FlannBasedDescriptorMatcherTest.java  | 10 ++++++++++
 modules/java/generator/gen_java.py                  | 13 ++++++++++---
 3 files changed, 30 insertions(+), 3 deletions(-)

diff --git a/modules/features2d/misc/java/test/BruteForceDescriptorMatcherTest.java b/modules/features2d/misc/java/test/BruteForceDescriptorMatcherTest.java
index c98ae128d4..45f83447d9 100644
--- a/modules/features2d/misc/java/test/BruteForceDescriptorMatcherTest.java
+++ b/modules/features2d/misc/java/test/BruteForceDescriptorMatcherTest.java
@@ -12,6 +12,7 @@ import org.opencv.core.Point;
 import org.opencv.core.Scalar;
 import org.opencv.core.DMatch;
 import org.opencv.features2d.DescriptorMatcher;
+import org.opencv.features2d.BFMatcher;
 import org.opencv.core.KeyPoint;
 import org.opencv.test.OpenCVTestCase;
 import org.opencv.test.OpenCVTestRunner;
@@ -93,6 +94,15 @@ public class BruteForceDescriptorMatcherTest extends OpenCVTestCase {
                 };
     }
 
+    // https://github.com/opencv/opencv/issues/11268
+    public void testConstructor()
+    {
+        BFMatcher self_created_matcher = new BFMatcher();
+        Mat train = new Mat(1, 1, CvType.CV_8U, new Scalar(123));
+        self_created_matcher.add(Arrays.asList(train));
+        assertTrue(!self_created_matcher.empty());
+    }
+
     public void testAdd() {
         matcher.add(Arrays.asList(new Mat()));
         assertFalse(matcher.empty());
diff --git a/modules/features2d/misc/java/test/FlannBasedDescriptorMatcherTest.java b/modules/features2d/misc/java/test/FlannBasedDescriptorMatcherTest.java
index 235d384b64..bc700ab7cb 100644
--- a/modules/features2d/misc/java/test/FlannBasedDescriptorMatcherTest.java
+++ b/modules/features2d/misc/java/test/FlannBasedDescriptorMatcherTest.java
@@ -12,6 +12,7 @@ import org.opencv.core.Point;
 import org.opencv.core.Scalar;
 import org.opencv.core.DMatch;
 import org.opencv.features2d.DescriptorMatcher;
+import org.opencv.features2d.FlannBasedMatcher;
 import org.opencv.core.KeyPoint;
 import org.opencv.test.OpenCVTestCase;
 import org.opencv.test.OpenCVTestRunner;
@@ -168,6 +169,15 @@ public class FlannBasedDescriptorMatcherTest extends OpenCVTestCase {
                 };
     }
 
+    // https://github.com/opencv/opencv/issues/11268
+    public void testConstructor()
+    {
+        FlannBasedMatcher self_created_matcher = new FlannBasedMatcher();
+        Mat train = new Mat(1, 1, CvType.CV_8U, new Scalar(123));
+        self_created_matcher.add(Arrays.asList(train));
+        assertTrue(!self_created_matcher.empty());
+    }
+
     public void testAdd() {
         matcher.add(Arrays.asList(new Mat()));
         assertFalse(matcher.empty());
diff --git a/modules/java/generator/gen_java.py b/modules/java/generator/gen_java.py
index ea1b89edd6..fe61c0be33 100755
--- a/modules/java/generator/gen_java.py
+++ b/modules/java/generator/gen_java.py
@@ -877,7 +877,10 @@ class JavaWrapperGenerator(object):
                 ret = ""
                 default = ""
             elif not fi.ctype: # c-tor
-                ret = "return (jlong) _retval_;"
+                if self.isSmartClass(ci):
+                    ret = "return (jlong)(new Ptr<%(ctype)s>(_retval_));" % { 'ctype': fi.fullClass(isCPP=True) }
+                else:
+                    ret = "return (jlong) _retval_;"
             elif "v_type" in type_dict[fi.ctype]: # c-tor
                 if type_dict[fi.ctype]["v_type"] in ("Mat", "vector_Mat"):
                     ret = "return (jlong) _retval_;"
@@ -920,8 +923,12 @@ class JavaWrapperGenerator(object):
                         c_epilogue.append("return " + fi.ctype + "_to_List(env, _ret_val_vector_);")
             if fi.classname:
                 if not fi.ctype: # c-tor
-                    retval = fi.fullClass(isCPP=True) + "* _retval_ = "
-                    cvname = "new " + fi.fullClass(isCPP=True)
+                    if self.isSmartClass(ci):
+                        retval = self.smartWrap(ci, fi.fullClass(isCPP=True)) + " _retval_ = "
+                        cvname = "makePtr<" + fi.fullClass(isCPP=True) +">"
+                    else:
+                        retval = fi.fullClass(isCPP=True) + "* _retval_ = "
+                        cvname = "new " + fi.fullClass(isCPP=True)
                 elif fi.static:
                     cvname = fi.fullName(isCPP=True)
                 else: