\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
"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
"__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
"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
\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
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
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
\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
"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
\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
\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
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
\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
\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
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
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
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
{"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
# 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
\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
""" % {"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