Java API generator: refactored manual const and funcs handling, collected real 'impor...
authorAndrey Pavlenko <no@email>
Thu, 21 Jul 2011 17:20:17 +0000 (17:20 +0000)
committerAndrey Pavlenko <no@email>
Thu, 21 Jul 2011 17:20:17 +0000 (17:20 +0000)
modules/java/gen_java.py

index fe1ea89..93d341d 100644 (file)
@@ -8,30 +8,9 @@ except:
 \r
 class_ignore_list = (\r
     #core\r
-    "FileNode",\r
-    "FileStorage",\r
+    "FileNode", "FileStorage",\r
     #highgui\r
-    "VideoWriter",\r
-    "VideoCapture",\r
-)\r
-\r
-func_ignore_list = (\r
-    #core\r
-    "checkHardwareSupport",\r
-    "setUseOptimized",\r
-    "useOptimized",\r
-    "vconcat",\r
-    #highgui\r
-    "namedWindow",\r
-    "destroyWindow",\r
-    "destroyAllWindows",\r
-    "startWindowThread",\r
-    "setWindowProperty",\r
-    "getWindowProperty",\r
-    "getTrackbarPos",\r
-    "setTrackbarPos",\r
-    "imshow",\r
-    "waitKey",\r
+    "VideoWriter", "VideoCapture",\r
 )\r
 \r
 const_ignore_list = (\r
@@ -109,6 +88,64 @@ const_ignore_list = (
     "CV_FLOODFILL_.+",\r
 )\r
 \r
+# { Module : { public : [[name, val],...], private : [[]...] } }\r
+missing_consts = \\r
+{\r
+    'Core' :\r
+    {\r
+        'private' :\r
+        (\r
+            ('CV_8U',  0 ), ('CV_8S',  1 ),\r
+            ('CV_16U', 2 ), ('CV_16S', 3 ),\r
+            ('CV_32S', 4 ),\r
+            ('CV_32F', 5 ), ('CV_64F', 6 ),\r
+            ('CV_USRTYPE1', 7 ),\r
+        ) # private\r
+    }, # Core\r
+\r
+    "Imgproc":\r
+    {\r
+        'private' :\r
+        (\r
+            ('IPL_BORDER_CONSTANT',    0 ),\r
+            ('IPL_BORDER_REPLICATE',   1 ),\r
+            ('IPL_BORDER_REFLECT',     2 ),\r
+            ('IPL_BORDER_WRAP',        3 ),\r
+            ('IPL_BORDER_REFLECT_101', 4 ),\r
+            ('IPL_BORDER_TRANSPARENT', 5 ),\r
+        ) # private\r
+    }, # Imgproc\r
+\r
+    "Calib3d":\r
+    {\r
+        'public' :\r
+        (\r
+            ('CV_LMEDS',  4),\r
+            ('CV_RANSAC', 8),\r
+            ('CV_FM_LMEDS', 'CV_LMEDS'),\r
+            ('CV_FM_RANSAC','CV_RANSAC'),\r
+            ('CV_FM_7POINT', 1),\r
+            ('CV_FM_8POINT', 2),\r
+            ('CV_CALIB_USE_INTRINSIC_GUESS', 1),\r
+            ('CV_CALIB_FIX_ASPECT_RATIO',    2),\r
+            ('CV_CALIB_FIX_PRINCIPAL_POINT', 4),\r
+            ('CV_CALIB_ZERO_TANGENT_DIST',   8),\r
+            ('CV_CALIB_FIX_FOCAL_LENGTH',   16),\r
+            ('CV_CALIB_FIX_K1',             32),\r
+            ('CV_CALIB_FIX_K2',             64),\r
+            ('CV_CALIB_FIX_K3',            128),\r
+            ('CV_CALIB_FIX_K4',           2048),\r
+            ('CV_CALIB_FIX_K5',           4096),\r
+            ('CV_CALIB_FIX_K6',           8192),\r
+            ('CV_CALIB_RATIONAL_MODEL',  16384),\r
+            ('CV_CALIB_FIX_INTRINSIC',     256),\r
+            ('CV_CALIB_SAME_FOCAL_LENGTH', 512),\r
+            ('CV_CALIB_ZERO_DISPARITY',   1024),\r
+        ) # public\r
+    }, # Calib3d\r
+\r
+}\r
+\r
 \r
 # c_type    : { java/jni correspondence }\r
 type_dict = {\r
@@ -126,6 +163,9 @@ type_dict = {
     "__int64" : { "j_type" : "long", "jn_type" : "long", "jni_type" : "jlong", "suffix" : "J" },\r
     "int64"   : { "j_type" : "long", "jn_type" : "long", "jni_type" : "jlong", "suffix" : "J" },\r
     "double[]": { "j_type" : "double[]", "jn_type" : "double[]", "jni_type" : "jdoubleArray", "suffix" : "_3D" },\r
+\r
+# "complex" : { j_type : "?", jn_args : (("", ""),), jn_name : "", jni_var : "", jni_name : "", "suffix" : "?" },\r
+\r
     "vector_Point": { "j_type" : "java.util.List<Point>", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector<Point> %(n)s", "suffix" : "J" },\r
     "vector_Mat" :  { "j_type" : "java.util.List<Mat>", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector<Mat> %(n)s", "suffix" : "J" },\r
     "vector_KeyPoint" : { "j_type" : "java.util.List<KeyPoint>", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector<KeyPoint> %(n)s", "suffix" : "J" },\r
@@ -134,7 +174,7 @@ type_dict = {
     "vector_int" : { "j_type" : "java.util.List<Integer>", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector<int> %(n)s", "suffix" : "J" },\r
     "vector_float" : { "j_type" : "java.util.List<Float>", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector<float> %(n)s", "suffix" : "J" },\r
     "vector_double" : { "j_type" : "java.util.List<Double>", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector<double> %(n)s", "suffix" : "J" },\r
-# "complex" : { j_type : "?", jn_args : (("", ""),), jn_name : "", jni_var : "", jni_name : "", "suffix" : "?" },\r
+\r
     "Mat"     : { "j_type" : "Mat", "jn_type" : "long", "jn_args" : (("__int64", ".nativeObj"),),\r
                   "jni_var" : "Mat& %(n)s = *((Mat*)%(n)s_nativeObj)",\r
                   "jni_type" : "jlong", #"jni_name" : "*%(n)s",\r
@@ -200,12 +240,204 @@ type_dict = {
 \r
 }\r
 \r
-setManualFunctions=set(['minMaxLoc', 'getTextSize'])\r
+# { Module : { func : {j_code, jn_code, cpp_code} } }\r
+ManualFuncs = {\r
+    'Core' :\r
+    {\r
+        'minMaxLoc' : {\r
+            'j_code'   : """\r
+    // manual port\r
+    public static class MinMaxLocResult {\r
+        public double minVal;\r
+        public double maxVal;\r
+        public Point minLoc;\r
+        public Point maxLoc;\r
+\r
+       public MinMaxLocResult() {\r
+           minVal=0; maxVal=0;\r
+           minLoc=new Point();\r
+           maxLoc=new Point();\r
+       }\r
+    }\r
+\r
+    // C++: minMaxLoc(Mat src, double* minVal, double* maxVal=0, Point* minLoc=0, Point* maxLoc=0, InputArray mask=noArray())\r
+\r
+    //javadoc: minMaxLoc(src, mask)\r
+    public static MinMaxLocResult minMaxLoc(Mat src, Mat mask) {\r
+        MinMaxLocResult res = new MinMaxLocResult();\r
+        long maskNativeObj=0;\r
+        if (mask != null) {\r
+            maskNativeObj=mask.nativeObj;\r
+        }\r
+        double resarr[] = n_minMaxLocManual(src.nativeObj, maskNativeObj);\r
+        res.minVal=resarr[0];\r
+        res.maxVal=resarr[1];\r
+        res.minLoc.x=resarr[2];\r
+        res.minLoc.y=resarr[3];\r
+        res.maxLoc.x=resarr[4];\r
+        res.maxLoc.y=resarr[5];\r
+        return res;\r
+    }\r
+\r
+    //javadoc: minMaxLoc(src)\r
+    public static MinMaxLocResult minMaxLoc(Mat src) {\r
+        return minMaxLoc(src, null);\r
+    }\r
+\r
+""",\r
+            'jn_code'  :\r
+"""    private static native double[] n_minMaxLocManual(long src_nativeObj, long mask_nativeObj);\n""",\r
+            'cpp_code' :\r
+"""\r
+// C++: minMaxLoc(Mat src, double* minVal, double* maxVal=0, Point* minLoc=0, Point* maxLoc=0, InputArray mask=noArray())\r
+\r
+JNIEXPORT jdoubleArray JNICALL Java_org_opencv_core_Core_n_1minMaxLocManual\r
+  (JNIEnv* env, jclass cls, jlong src_nativeObj, jlong mask_nativeObj)\r
+{\r
+    try {\r
+        LOGD("Core::n_1minMaxLoc()");\r
+        jdoubleArray result;\r
+        result = env->NewDoubleArray(6);\r
+        if (result == NULL) {\r
+            return NULL; /* out of memory error thrown */\r
+        }\r
+\r
+        Mat& src = *((Mat*)src_nativeObj);\r
+\r
+        double minVal, maxVal;\r
+        Point minLoc, maxLoc;\r
+        if (mask_nativeObj != 0) {\r
+            Mat& mask = *((Mat*)mask_nativeObj);\r
+            minMaxLoc(src, &minVal, &maxVal, &minLoc, &maxLoc, mask);\r
+        } else {\r
+            minMaxLoc(src, &minVal, &maxVal, &minLoc, &maxLoc);\r
+        }\r
+\r
+        jdouble fill[6];\r
+        fill[0]=minVal;\r
+        fill[1]=maxVal;\r
+        fill[2]=minLoc.x;\r
+        fill[3]=minLoc.y;\r
+        fill[4]=maxLoc.x;\r
+        fill[5]=maxLoc.y;\r
+\r
+        env->SetDoubleArrayRegion(result, 0, 6, fill);\r
+\r
+       return result;\r
+\r
+    } catch(cv::Exception e) {\r
+        LOGD("Core::n_1minMaxLoc() catched cv::Exception: %s", e.what());\r
+        jclass je = env->FindClass("org/opencv/core/CvException");\r
+        if(!je) je = env->FindClass("java/lang/Exception");\r
+        env->ThrowNew(je, e.what());\r
+        return NULL;\r
+    } catch (...) {\r
+        LOGD("Core::n_1minMaxLoc() catched unknown exception (...)");\r
+        jclass je = env->FindClass("java/lang/Exception");\r
+        env->ThrowNew(je, "Unknown exception in JNI code {core::minMaxLoc()}");\r
+        return NULL;\r
+    }\r
+}\r
+\r
+""",\r
+        }, # minMaxLoc\r
+\r
+        'getTextSize' :\r
+        {\r
+            'j_code'   :\r
+"""\r
+    // C++: Size getTextSize(const string& text, int fontFace, double fontScale, int thickness, int* baseLine);\r
+    //javadoc:getTextSize(text, fontFace, fontScale, thickness, baseLine)\r
+    public static Size getTextSize(String text, int fontFace, double fontScale, int thickness, int[] baseLine) {\r
+        if(baseLine != null && baseLine.length != 1)\r
+            throw new java.lang.IllegalArgumentException("'baseLine' must be 'int[1]' or 'null'.");\r
+        Size retVal = new Size(n_getTextSize(text, fontFace, fontScale, thickness, baseLine));\r
+        return retVal;\r
+    }\r
+""",\r
+            'jn_code'  :\r
+"""    private static native double[] n_getTextSize(String text, int fontFace, double fontScale, int thickness, int[] baseLine);\n""",\r
+            'cpp_code' :\r
+"""\r
+// C++: Size getTextSize(const string& text, int fontFace, double fontScale, int thickness, int* baseLine);\r
+\r
+JNIEXPORT jdoubleArray JNICALL Java_org_opencv_core_Core_n_1getTextSize\r
+  (JNIEnv* env, jclass cls, jstring text, jint fontFace, jdouble fontScale, jint thickness, jintArray baseLine)\r
+{\r
+    try {\r
+        LOGD("Core::n_1getTextSize()");\r
+        jdoubleArray result;\r
+        result = env->NewDoubleArray(2);\r
+        if (result == NULL) {\r
+            return NULL; /* out of memory error thrown */\r
+        }\r
+\r
+        const char* utf_text = env->GetStringUTFChars(text, 0);\r
+        std::string n_text( utf_text ? utf_text : "" );\r
+        env->ReleaseStringUTFChars(text, utf_text);\r
+\r
+        int _baseLine;\r
+        int* pbaseLine = 0;\r
+\r
+        if (baseLine != NULL)\r
+            pbaseLine = &_baseLine;\r
+\r
+        cv::Size rsize = cv::getTextSize(n_text, (int)fontFace, (double)fontScale, (int)thickness, pbaseLine);\r
+\r
+        jdouble fill[2];\r
+        fill[0]=rsize.width;\r
+        fill[1]=rsize.height;\r
+\r
+        env->SetDoubleArrayRegion(result, 0, 2, fill);\r
+\r
+        if (baseLine != NULL)\r
+            env->SetIntArrayRegion(baseLine, 0, 1, pbaseLine);\r
+\r
+        return result;\r
+\r
+    } catch(cv::Exception e) {\r
+        LOGD("Core::n_1getTextSize() catched cv::Exception: %s", e.what());\r
+        jclass je = env->FindClass("org/opencv/core/CvException");\r
+        if(!je) je = env->FindClass("java/lang/Exception");\r
+        env->ThrowNew(je, e.what());\r
+        return NULL;\r
+    } catch (...) {\r
+        LOGD("Core::n_1getTextSize() catched unknown exception (...)");\r
+        jclass je = env->FindClass("java/lang/Exception");\r
+        env->ThrowNew(je, "Unknown exception in JNI code {core::getTextSize()}");\r
+        return NULL;\r
+    }\r
+}\r
+\r
+""",\r
+        }, # getTextSize\r
+\r
+        "checkHardwareSupport" : {'j_code' : '', 'jn_code' : '', 'cpp_code' : '' },\r
+        "setUseOptimized"      : {'j_code' : '', 'jn_code' : '', 'cpp_code' : '' },\r
+        "useOptimized"         : {'j_code' : '', 'jn_code' : '', 'cpp_code' : '' },\r
+        "vconcat"              : {'j_code' : '', 'jn_code' : '', 'cpp_code' : '' },\r
+\r
+    }, # Core\r
+\r
+    'Highgui' :\r
+    {\r
+        "namedWindow"       : {'j_code' : '', 'jn_code' : '', 'cpp_code' : '' },\r
+        "destroyWindow"     : {'j_code' : '', 'jn_code' : '', 'cpp_code' : '' },\r
+        "destroyAllWindows" : {'j_code' : '', 'jn_code' : '', 'cpp_code' : '' },\r
+        "startWindowThread" : {'j_code' : '', 'jn_code' : '', 'cpp_code' : '' },\r
+        "setWindowProperty" : {'j_code' : '', 'jn_code' : '', 'cpp_code' : '' },\r
+        "getWindowProperty" : {'j_code' : '', 'jn_code' : '', 'cpp_code' : '' },\r
+        "getTrackbarPos"    : {'j_code' : '', 'jn_code' : '', 'cpp_code' : '' },\r
+        "setTrackbarPos"    : {'j_code' : '', 'jn_code' : '', 'cpp_code' : '' },\r
+        "imshow"            : {'j_code' : '', 'jn_code' : '', 'cpp_code' : '' },\r
+        "waitKey"           : {'j_code' : '', 'jn_code' : '', 'cpp_code' : '' },\r
+    }, # Highgui\r
+}\r
 \r
 class ConstInfo(object):\r
     def __init__(self, cname, name, val):\r
         self.cname = cname\r
-        self.name =  re.sub(r"^Cv", "", name)\r
+        self.name = re.sub(r"^Cv", "", name)\r
         self.value = val\r
 \r
 \r
@@ -223,6 +455,8 @@ class ClassInfo(object):
         self.cname =self.cname.replace(".", "::")\r
         self.methods = {}\r
         self.consts = [] # using a list to save the occurence order\r
+        self.private_consts = []\r
+        self.imports = set()\r
         self.props= []\r
         for m in decl[2]:\r
             if m.startswith("="):\r
@@ -264,8 +498,6 @@ class FuncInfo(object):
                 self.jname = m[1:]\r
         self.jn_name = "n_" + self.jname\r
         self.jni_name= re.sub(r"_", "_1", self.jn_name)\r
-##        if self.classname:\r
-##            self.jni_name = "00024" + self.classname + "_" + self.jni_name\r
         self.static = ["","static"][ "/S" in decl[2] ]\r
         self.ctype = decl[1] or ""\r
         self.args = []\r
@@ -298,8 +530,6 @@ class JavaWrapperGenerator(object):
 \r
     def clear(self):\r
         self.classes = { "Mat" : ClassInfo([ 'class Mat', [], [] ]) }\r
-        self.funcs = {}\r
-        self.consts = [] # using a list to save the occurence order\r
         self.module = ""\r
         self.Module = ""\r
         self.java_code= {} # { class : {j_code, jn_code} }\r
@@ -357,6 +587,15 @@ public class %s {
               "jni_name" : "(*("+classinfo.name+"*)%(n)s_nativeObj)", "jni_type" : "jlong",\r
               "suffix" : "J" }\r
 \r
+        # missing_consts { Module : { public : [[name, val],...], private : [[]...] } }\r
+        if classinfo.name in missing_consts:\r
+            if 'private' in missing_consts[classinfo.name]:\r
+                for (name, val) in missing_consts[classinfo.name]['private']:\r
+                    classinfo.private_consts.append( ConstInfo(name, name, val) )\r
+            if 'public' in missing_consts[classinfo.name]:\r
+                for (name, val) in missing_consts[classinfo.name]['public']:\r
+                    classinfo.consts.append( ConstInfo(name, name, val) )\r
+\r
         # class props\r
         for p in decl[3]:\r
             if "vector" not in p[0]:\r
@@ -368,24 +607,24 @@ public class %s {
 \r
 \r
     def add_const(self, decl): # [ "const cname", val, [], [] ]\r
-        consts = self.consts\r
         name = decl[0].replace("const ", "").strip()\r
         name = re.sub(r"^cv\.", "", name)\r
         cname = name.replace(".", "::")\r
         for c in const_ignore_list:\r
             if re.match(c, name):\r
                 return\r
-        # check if it's a class member\r
+        # class member?\r
         dpos = name.rfind(".")\r
         if dpos >= 0:\r
             classname = name[:dpos]\r
             name = name[dpos+1:]\r
-            if classname in self.classes:\r
-                consts = self.classes[classname].consts\r
-            else:\r
-                # this class isn't wrapped\r
-                # skipping this const\r
-                return\r
+        else:\r
+            classname = self.Module\r
+        if classname not in self.classes:\r
+            # this class isn't wrapped\r
+            # skipping this const\r
+            return\r
+        consts = self.classes[classname].consts\r
         constinfo = ConstInfo(cname, name, decl[1])\r
         # checking duplication\r
         for c in consts:\r
@@ -397,20 +636,16 @@ public class %s {
 \r
     def add_func(self, decl):\r
         ffi = FuncFamilyInfo(decl)\r
-       if ffi.jname in setManualFunctions :\r
-               print "Found function, which is ported manually: " + ffi.jname\r
-               return None\r
-        func_map = self.funcs\r
-        classname = ffi.funcs[0].classname\r
-        if classname in class_ignore_list or ffi.jname in func_ignore_list:\r
+        classname = ffi.funcs[0].classname or self.Module\r
+        if classname in class_ignore_list:\r
             return\r
-        if classname:\r
-            if classname in self.classes:\r
-                func_map = self.classes[classname].methods\r
-            else:\r
-                print "Generator error: the class %s for method %s is missing" % \\r
-                        (classname, ffi.jname)\r
-                sys.exit(-1)\r
+        if classname in ManualFuncs and ffi.jname in ManualFuncs[classname]:\r
+            return\r
+        if classname not in self.classes:\r
+            print "Generator error: the class %s for method %s is missing" % \\r
+                    (classname, ffi.jname)\r
+            sys.exit(-1)\r
+        func_map = self.classes[classname].methods\r
         if ffi.jname in func_map:\r
             func_map[ffi.jname].add_func(ffi.funcs[0])\r
         else:\r
@@ -427,117 +662,21 @@ public class %s {
         self.Module = module.capitalize()\r
         parser = hdr_parser.CppHeaderParser()\r
 \r
-        # step 1: scan the headers and build more descriptive maps of classes, consts, functions\r
+        self.add_class( ['class ' + self.Module, [], [], []] ) # [ 'class/struct cname', [bases], [modlist] [props] ]\r
+\r
+        # scan the headers and build more descriptive maps of classes, consts, functions\r
         for hdr in srcfiles:\r
             decls = parser.parse(hdr)\r
             for decl in decls:\r
                 name = decl[0]\r
                 if name.startswith("struct") or name.startswith("class"):\r
                     self.add_class(decl)\r
-                    pass\r
                 elif name.startswith("const"):\r
                     self.add_const(decl)\r
                 else: # function\r
                     self.add_func(decl)\r
-                    pass\r
 \r
-        self.add_class_code_stream(self.Module)\r
         self.cpp_code = StringIO()\r
-\r
-        # java code\r
-        if module == "core":\r
-            self.java_code[self.Module]["j_code"].write(\\r
-"""\r
-    private static final int\r
-            CV_8U  = 0, CV_8S  = 1, CV_16U = 2, CV_16S = 3, CV_32S = 4, CV_32F = 5, CV_64F = 6, CV_USRTYPE1 = 7;\r
-\r
-    //Manual ported functions\r
-\r
-    // C++: minMaxLoc(Mat src, double* minVal, double* maxVal=0, Point* minLoc=0, Point* maxLoc=0, InputArray mask=noArray())\r
-    //javadoc: minMaxLoc\r
-    public static class MinMaxLocResult {\r
-        public double minVal;\r
-        public double maxVal;\r
-        public Point minLoc;\r
-        public Point maxLoc;\r
-\r
-       public MinMaxLocResult() {\r
-           minVal=0; maxVal=0;\r
-           minLoc=new Point();\r
-           maxLoc=new Point();\r
-       }\r
-    }\r
-    public static MinMaxLocResult minMaxLoc(Mat src, Mat mask) {\r
-        MinMaxLocResult res = new MinMaxLocResult();\r
-        long maskNativeObj=0;\r
-        if (mask != null) {\r
-                maskNativeObj=mask.nativeObj;\r
-        }\r
-        double resarr[] = n_minMaxLocManual(src.nativeObj, maskNativeObj);\r
-        res.minVal=resarr[0];\r
-        res.maxVal=resarr[1];\r
-        res.minLoc.x=resarr[2];\r
-        res.minLoc.y=resarr[3];\r
-        res.maxLoc.x=resarr[4];\r
-        res.maxLoc.y=resarr[5];\r
-        return res;\r
-    }\r
-    public static MinMaxLocResult minMaxLoc(Mat src) {\r
-        return minMaxLoc(src, null);\r
-    }\r
-    private static native double[] n_minMaxLocManual(long src_nativeObj, long mask_nativeObj);\r
-\r
-    //javadoc:getTextSize(text, fontFace, fontScale, thickness, baseLine)\r
-    public static Size getTextSize(String text, int fontFace, double fontScale, int thickness, int[] baseLine) {\r
-        assert(baseLine == null || baseLine.length == 1);\r
-        Size retVal = new Size(n_getTextSize(text, fontFace, fontScale, thickness, baseLine));\r
-        return retVal;\r
-    }\r
-    private static native double[] n_getTextSize(String text, int fontFace, double fontScale, int thickness, int[] baseLine);\r
-\r
-""" )\r
-\r
-        if module == "imgproc":\r
-            self.java_code[self.Module]["j_code"].write(\\r
-"""\r
-    private static final int\r
-            IPL_BORDER_CONSTANT = 0, IPL_BORDER_REPLICATE = 1, IPL_BORDER_REFLECT = 2,\r
-            IPL_BORDER_WRAP = 3, IPL_BORDER_REFLECT_101 = 4, IPL_BORDER_TRANSPARENT = 5;\r
-""" )\r
-\r
-        if module == "calib3d":\r
-            self.java_code[self.Module]["j_code"].write(\\r
-"""\r
-    public static final int\r
-            CV_LMEDS = 4,\r
-            CV_RANSAC = 8,\r
-            CV_FM_LMEDS = CV_LMEDS,\r
-            CV_FM_RANSAC = CV_RANSAC;\r
-\r
-    public static final int\r
-            CV_FM_7POINT = 1,\r
-            CV_FM_8POINT = 2;\r
-\r
-    public static final int\r
-            CV_CALIB_USE_INTRINSIC_GUESS = 1,\r
-            CV_CALIB_FIX_ASPECT_RATIO = 2,\r
-            CV_CALIB_FIX_PRINCIPAL_POINT = 4,\r
-            CV_CALIB_ZERO_TANGENT_DIST = 8,\r
-            CV_CALIB_FIX_FOCAL_LENGTH = 16,\r
-            CV_CALIB_FIX_K1 = 32,\r
-            CV_CALIB_FIX_K2 = 64,\r
-            CV_CALIB_FIX_K3 = 128,\r
-            CV_CALIB_FIX_K4 = 2048,\r
-            CV_CALIB_FIX_K5 = 4096,\r
-            CV_CALIB_FIX_K6 = 8192,\r
-            CV_CALIB_RATIONAL_MODEL = 16384,\r
-            CV_CALIB_FIX_INTRINSIC = 256,\r
-            CV_CALIB_SAME_FOCAL_LENGTH = 512,\r
-            CV_CALIB_ZERO_DISPARITY = 1024;\r
-""" )\r
-\r
-\r
-        # cpp module header\r
         self.cpp_code.write("""\r
 //\r
 // This file is auto-generated, please don't edit!\r
@@ -545,129 +684,30 @@ public class %s {
 \r
 #include <jni.h>\r
 \r
+#include "utils.h"\r
+\r
 #ifdef DEBUG\r
 #include <android/log.h>\r
-#define MODULE_LOG_TAG "OpenCV.%s"\r
+#define MODULE_LOG_TAG "OpenCV.%(m)s"\r
 #define LOGD(...) ((void)__android_log_print(ANDROID_LOG_DEBUG, MODULE_LOG_TAG, __VA_ARGS__))\r
 #else //DEBUG\r
 #define LOGD(...)\r
 #endif //DEBUG\r
 \r
-#include "utils.h"\r
-""" % module)\r
-        self.cpp_code.write( "\n".join(['#include "opencv2/%s/%s"' % (module, os.path.basename(f)) \\r
-                            for f in srcfiles]) )\r
-        self.cpp_code.write('\nusing namespace cv;\n')\r
-        self.cpp_code.write('\n\nextern "C" {\n\n')\r
-\r
-        # step 2: generate the code for global constants\r
-        self.gen_consts(self.consts, self.java_code[self.Module]["j_code"])\r
-\r
-        # step 3: generate the code for all the global functions\r
-        self.gen_funcs()\r
-\r
-        # step 4: generate code for the classes\r
-        self.gen_classes()\r
-\r
-        if module == "core":\r
-            self.cpp_code.write(\\r
-"""\r
-JNIEXPORT jdoubleArray JNICALL Java_org_opencv_core_Core_n_1minMaxLocManual\r
-  (JNIEnv* env, jclass cls, jlong src_nativeObj, jlong mask_nativeObj)\r
-{\r
-    try {\r
-        LOGD("Core::n_1minMaxLoc()");\r
-        jdoubleArray result;\r
-        result = env->NewDoubleArray(6);\r
-        if (result == NULL) {\r
-            return NULL; /* out of memory error thrown */\r
-        }\r
-\r
-        Mat& src = *((Mat*)src_nativeObj);\r
-\r
-        double minVal, maxVal;\r
-        Point minLoc, maxLoc;\r
-        if (mask_nativeObj != 0) {\r
-            Mat& mask = *((Mat*)mask_nativeObj);\r
-            minMaxLoc(src, &minVal, &maxVal, &minLoc, &maxLoc, mask);\r
-        } else {\r
-            minMaxLoc(src, &minVal, &maxVal, &minLoc, &maxLoc);\r
-        }\r
-\r
-        jdouble fill[6];\r
-        fill[0]=minVal;\r
-        fill[1]=maxVal;\r
-        fill[2]=minLoc.x;\r
-        fill[3]=minLoc.y;\r
-        fill[4]=maxLoc.x;\r
-        fill[5]=maxLoc.y;\r
-\r
-        env->SetDoubleArrayRegion(result, 0, 6, fill);\r
-\r
-       return result;\r
-\r
-    } catch(cv::Exception e) {\r
-        LOGD("Core::n_1minMaxLoc() catched cv::Exception: %s", e.what());\r
-        jclass je = env->FindClass("org/opencv/core/CvException");\r
-        if(!je) je = env->FindClass("java/lang/Exception");\r
-        env->ThrowNew(je, e.what());\r
-        return NULL;\r
-    } catch (...) {\r
-        LOGD("Core::n_1minMaxLoc() catched unknown exception (...)");\r
-        jclass je = env->FindClass("java/lang/Exception");\r
-        env->ThrowNew(je, "Unknown exception in JNI code {core::minMaxLoc()}");\r
-        return NULL;\r
-    }\r
-}\r
-\r
-JNIEXPORT jdoubleArray JNICALL Java_org_opencv_core_Core_n_1getTextSize\r
-  (JNIEnv* env, jclass cls, jstring text, jint fontFace, jdouble fontScale, jint thickness, jintArray baseLine)\r
-{\r
-    try {\r
-        LOGD("Core::n_1getTextSize()");\r
-        jdoubleArray result;\r
-        result = env->NewDoubleArray(2);\r
-        if (result == NULL) {\r
-            return NULL; /* out of memory error thrown */\r
-        }\r
-\r
-        const char* utf_text = env->GetStringUTFChars(text, 0);\r
-        std::string n_text( utf_text ? utf_text : "" );\r
-        env->ReleaseStringUTFChars(text, utf_text);\r
-\r
-        int _baseLine;\r
-        int* pbaseLine = 0;\r
-\r
-        if (baseLine != NULL)\r
-            pbaseLine = &_baseLine;\r
+#include "opencv2/%(m)s/%(m)s.hpp"\r
 \r
-        cv::Size rsize = cv::getTextSize(n_text, (int)fontFace, (double)fontScale, (int)thickness, pbaseLine);\r
+using namespace cv;\r
 \r
-        jdouble fill[2];\r
-        fill[0]=rsize.width;\r
-        fill[1]=rsize.height;\r
+extern "C" {\r
 \r
-        env->SetDoubleArrayRegion(result, 0, 2, fill);\r
+""" % {'m' : module} )\r
 \r
-        if (baseLine != NULL)\r
-            env->SetIntArrayRegion(baseLine, 0, 1, pbaseLine);\r
+        #"\n".join(['#include "opencv2/%s/%s"' % (module, os.path.basename(f)) for f in srcfiles])\r
 \r
-        return result;\r
+        # generate code for the classes\r
+        for name in self.classes.keys():\r
+            self.gen_class(name)\r
 \r
-    } catch(cv::Exception e) {\r
-        LOGD("Core::n_1getTextSize() catched cv::Exception: %s", e.what());\r
-        jclass je = env->FindClass("org/opencv/core/CvException");\r
-        if(!je) je = env->FindClass("java/lang/Exception");\r
-        env->ThrowNew(je, e.what());\r
-        return NULL;\r
-    } catch (...) {\r
-        LOGD("Core::n_1getTextSize() catched unknown exception (...)");\r
-        jclass je = env->FindClass("java/lang/Exception");\r
-        env->ThrowNew(je, "Unknown exception in JNI code {core::getTextSize()}");\r
-        return NULL;\r
-    }\r
-}\r
-""")\r
         # saving code streams\r
         for cls in self.java_code.keys():\r
             self.java_code[cls]["j_code"].write("\n\n%s\n}\n" % self.java_code[cls]["jn_code"].getvalue())\r
@@ -692,46 +732,33 @@ JNIEXPORT jdoubleArray JNICALL Java_org_opencv_core_Core_n_1getTextSize
 \r
 \r
 \r
-    def gen_consts(self, consts, code_stream):\r
-        if consts:\r
-            code_stream.write("""\r
-    public static final int\r
-            %s;\n\n""" % (",\n"+" "*12).join(["%s = %s" % (c.name, c.value) for c in consts])\r
-            )\r
-\r
 \r
     def gen_func(self, fi, isoverload):\r
-        # // C++: c_decl\r
-        # e.g: //  C++: void add(Mat src1, Mat src2, Mat dst, Mat mask = Mat(), int dtype = -1)\r
-        decl_args = []\r
-        for a in fi.args:\r
-            s = a.ctype\r
-            if a.pointer:\r
-                s += "*"\r
-            elif a.out:\r
-                s += "&"\r
-            s += " " + a.name\r
-            if a.defval:\r
-                s += " = "+a.defval\r
-            decl_args.append(s)\r
-        c_decl = "%s %s %s(%s)" % ( fi.static, fi.ctype, fi.cname, ", ".join(decl_args) )\r
-\r
-        #java doc comment\r
-        f_name = fi.name\r
-        if fi.classname:\r
-            f_name = fi.classname + "::" + fi.name\r
-        java_doc = "//javadoc: " + f_name + "(%s)" % ", ".join([a.name for a in fi.args])\r
-\r
-        self.gen_func2(fi, isoverload, c_decl, java_doc, "")\r
-\r
-\r
-    def gen_func2(self, fi, isoverload, c_decl, java_doc, prop_name):\r
-        j_code   = self.java_code[self.Module]["j_code"]\r
-        jn_code  = self.java_code[self.Module]["jn_code"]\r
+        self.gen_func2(fi, isoverload, "")\r
+\r
+\r
+    def gen_func2(self, fi, isoverload, prop_name):\r
+        j_code   = self.java_code[fi.classname or self.Module]["j_code"]\r
+        jn_code  = self.java_code[fi.classname or self.Module]["jn_code"]\r
         cpp_code = self.cpp_code\r
-        if fi.classname:\r
-            j_code   = self.java_code[fi.classname]["j_code"]\r
-            jn_code  = self.java_code[fi.classname]["jn_code"]\r
+\r
+        # c_decl\r
+        # e.g: void add(Mat src1, Mat src2, Mat dst, Mat mask = Mat(), int dtype = -1)\r
+        if prop_name:\r
+            c_decl = "%s %s::%s" % (fi.ctype, fi.classname, prop_name)\r
+        else:\r
+            decl_args = []\r
+            for a in fi.args:\r
+                s = a.ctype\r
+                if a.pointer:\r
+                    s += "*"\r
+                elif a.out:\r
+                    s += "&"\r
+                s += " " + a.name\r
+                if a.defval:\r
+                    s += " = "+a.defval\r
+                decl_args.append(s)\r
+            c_decl = "%s %s %s(%s)" % ( fi.static, fi.ctype, fi.cname, ", ".join(decl_args) )\r
 \r
         # java comment\r
         j_code.write( "\n    //\n    // C++: %s\n    //\n\n" % c_decl )\r
@@ -772,7 +799,11 @@ JNIEXPORT jdoubleArray JNICALL Java_org_opencv_core_Core_n_1getTextSize
             j_epilogue = []\r
             c_prologue = []\r
             c_epilogue = []\r
+            if fi.ctype == 'Mat':\r
+                self.classes[fi.classname or self.Module].imports.add("org.opencv.core.Mat")\r
             if type_dict[fi.ctype]["jni_type"] == "jdoubleArray":\r
+                if "Vec" not in fi.ctype:\r
+                    self.classes[fi.classname or self.Module].imports.add("org.opencv.core." + type_dict[fi.ctype]["j_type"])\r
                 fields = type_dict[fi.ctype]["jn_args"]\r
                 c_epilogue.append( \\r
                     ("jdoubleArray _da_retval_ = env->NewDoubleArray(%(cnt)i);  " +\r
@@ -788,6 +819,9 @@ JNIEXPORT jdoubleArray JNICALL Java_org_opencv_core_Core_n_1getTextSize
                 suffix += type_dict[a.ctype].get("suffix") or ""\r
 \r
                 if "vector" in a.ctype: # pass as Mat\r
+                    self.classes[fi.classname or self.Module].imports.add("org.opencv.core.Mat")\r
+                    self.classes[fi.classname or self.Module].imports.add("org.opencv.core.Utils")\r
+                    self.classes[fi.classname or self.Module].imports.add("java.util.List")\r
                     jn_args.append  ( ArgInfo([ "__int64", "%s_mat.nativeObj" % a.name, "", [], "" ]) )\r
                     jni_args.append ( ArgInfo([ "__int64", "%s_mat_nativeObj" % a.name, "", [], "" ]) )\r
                     c_prologue.append( type_dict[a.ctype]["jni_var"] % {"n" : a.name} + ";" )\r
@@ -801,7 +835,10 @@ JNIEXPORT jdoubleArray JNICALL Java_org_opencv_core_Core_n_1getTextSize
                         j_epilogue.append("utils.Mat_to_%(t)s(%(n)s_mat, %(n)s);" % {"t" : a.ctype, "n" : a.name})\r
                         c_epilogue.append( "%(t)s_to_Mat( %(n)s, %(n)s_mat );" % {"n" : a.name, "t" : a.ctype} )\r
                 else:\r
-\r
+                    if "jn_args" in type_dict[a.ctype] and "Vec" not in a.ctype:\r
+                        self.classes[fi.classname or self.Module].imports.add("org.opencv.core." + type_dict[a.ctype]['j_type'])\r
+                    if 'String' in type_dict[a.ctype]['j_type']:\r
+                        self.classes[fi.classname or self.Module].imports.add("java.lang.String")\r
                     fields = type_dict[a.ctype].get("jn_args", ((a.ctype, ""),))\r
                     if "I" in a.out or not a.out or a.ctype in self.classes: # input arg, pass by primitive fields\r
                         for f in fields:\r
@@ -818,7 +855,6 @@ JNIEXPORT jdoubleArray JNICALL Java_org_opencv_core_Core_n_1getTextSize
                                 {"n" : a.name, "t": ("("+type_dict[f[0]]["j_type"]+")", "")[f[0]=="double"], "f" : f[1], "i" : i}\r
                             )\r
                             i += 1\r
-                        #j_epilogue.append("%s.set(%s_out);" % (a.name, a.name))\r
                         j_epilogue.append("; ".join(set_vals) + "; ")\r
                         c_epilogue.append( \\r
                             "jdouble tmp_%(n)s[%(cnt)i] = {%(args)s}; env->SetDoubleArrayRegion(%(n)s_out, 0, %(cnt)i, tmp_%(n)s);" %\r
@@ -839,9 +875,10 @@ JNIEXPORT jdoubleArray JNICALL Java_org_opencv_core_Core_n_1getTextSize
             # java part:\r
 \r
             #java doc comment\r
-##            f_name = fi.name\r
-##            if fi.classname:\r
-##                f_name = fi.classname + "::" + fi.name\r
+            f_name = fi.name\r
+            if fi.classname:\r
+                f_name = fi.classname + "::" + fi.name\r
+            java_doc = "//javadoc: " + f_name + "(%s)" % ", ".join([a.name for a in args])\r
             j_code.write(" "*4 + java_doc + "\n")\r
 \r
             # public java wrapper method impl (calling native one above)\r
@@ -998,51 +1035,56 @@ JNIEXPORT $rtype JNICALL Java_org_opencv_${module}_${clazz}_$fname
 \r
 \r
 \r
-    def gen_funcs(self):\r
-        # generate the code for all the global functions\r
-        fflist = self.funcs.items()\r
+    def gen_class(self, name):\r
+        # generate code for the class\r
+        if name == "Mat":\r
+            return\r
+        ci = self.classes[name]\r
+        # constants\r
+        if ci.private_consts:\r
+            self.java_code[name]['j_code'].write("""\r
+    private static final int\r
+            %s;\n\n""" % (",\n"+" "*12).join(["%s = %s" % (c.name, c.value) for c in ci.private_consts])\r
+            )\r
+        if ci.consts:\r
+            self.java_code[name]['j_code'].write("""\r
+    public static final int\r
+            %s;\n\n""" % (",\n"+" "*12).join(["%s = %s" % (c.name, c.value) for c in ci.consts])\r
+            )\r
+        # c-tors\r
+        fflist = ci.methods.items()\r
         fflist.sort()\r
-        for name, ffi in fflist:\r
-            assert not ffi.funcs[0].classname, "Error: global func is a class member - "+name\r
-            for fi in ffi.funcs:\r
-                self.gen_func(fi, len(ffi.funcs)>1)\r
-\r
-\r
-    def gen_classes(self):\r
-        # generate code for the classes (their methods and consts)\r
-        classlist = self.classes.items()\r
-        classlist.sort()\r
-        for name, ci in classlist:\r
-            if name == "Mat":\r
-                continue\r
-            # constants\r
-            self.gen_consts(ci.consts, self.java_code[name]["j_code"])\r
-            # c-tors\r
-            fflist = ci.methods.items()\r
-            fflist.sort()\r
-            for n, ffi in fflist:\r
-                if ffi.isconstructor:\r
-                    for fi in ffi.funcs:\r
-                        self.gen_func(fi, len(ffi.funcs)>1)\r
-            # other methods\r
-            for n, ffi in fflist:\r
-                if not ffi.isconstructor:\r
-                    for fi in ffi.funcs:\r
-                        self.gen_func(fi, len(ffi.funcs)>1)\r
-            # props\r
-            for pi in ci.props:\r
-                # getter\r
-                getter_name = name + ".get_" + pi.name\r
-                #print getter_name\r
-                fi = FuncInfo( [getter_name, pi.ctype, [], []] ) # [ funcname, return_ctype, [modifiers], [args] ]\r
-                self.gen_func2(fi, getter_name in ci.methods, "// %s %s" % (pi.ctype, pi.name), "//javadoc: %s::%s" % (name, pi.name), pi.name)\r
-                if pi.rw:\r
-                    #setter\r
-                    setter_name = name + ".set_" + pi.name\r
-                    #print setter_name\r
-                    fi = FuncInfo( [ setter_name, "void", [], [ [pi.ctype, pi.name, "", [], ""] ] ] )\r
-                    self.gen_func2(fi, getter_name in ci.methods, "// %s %s" % (pi.ctype, pi.name), "//javadoc: %s::%s" % (name, pi.name), pi.name)\r
-\r
+        for n, ffi in fflist:\r
+            if ffi.isconstructor:\r
+                for fi in ffi.funcs:\r
+                    self.gen_func(fi, len(ffi.funcs)>1)\r
+        # other methods\r
+        for n, ffi in fflist:\r
+            if not ffi.isconstructor:\r
+                for fi in ffi.funcs:\r
+                    self.gen_func(fi, len(ffi.funcs)>1)\r
+        # props\r
+        for pi in ci.props:\r
+            # getter\r
+            getter_name = name + ".get_" + pi.name\r
+            #print getter_name\r
+            fi = FuncInfo( [getter_name, pi.ctype, [], []] ) # [ funcname, return_ctype, [modifiers], [args] ]\r
+            self.gen_func2(fi, getter_name in ci.methods, pi.name)\r
+            if pi.rw:\r
+                #setter\r
+                setter_name = name + ".set_" + pi.name\r
+                #print setter_name\r
+                fi = FuncInfo( [ setter_name, "void", [], [ [pi.ctype, pi.name, "", [], ""] ] ] )\r
+                self.gen_func2(fi, getter_name in ci.methods, pi.name)\r
+\r
+        # manual ports\r
+        if name in ManualFuncs:\r
+            for func in ManualFuncs[name].keys():\r
+                self.java_code[name]["j_code"].write ( ManualFuncs[name][func]["j_code"] )\r
+                self.java_code[name]["jn_code"].write( ManualFuncs[name][func]["jn_code"] )\r
+                self.cpp_code.write( ManualFuncs[name][func]["cpp_code"] )\r
+\r
+        if name != self.Module:\r
             # finalize()\r
             self.java_code[name]["j_code"].write(\r
 """\r
@@ -1076,6 +1118,9 @@ JNIEXPORT void JNICALL Java_org_opencv_%(module)s_%(cls)s_n_1delete
 """ % {"module" : module, "cls" : name}\r
             )\r
 \r
+        self.java_code[name]["jn_code"].write( "\n// imports %i\n//" % len(ci.imports))\r
+        self.java_code[name]["jn_code"].write( "\n//".join(sorted(ci.imports)))\r
+\r
 \r
 if __name__ == "__main__":\r
     if len(sys.argv) < 4:\r