From 32d4d7929ea29f158be3d244ed42469374456bfc Mon Sep 17 00:00:00 2001 From: Andrey Pavlenko Date: Thu, 15 Mar 2012 09:11:04 +0000 Subject: [PATCH] Java API: adding C++ classes inheritance support --- .../org/opencv/test/ml/CvStatModelTest.java | 29 ---------- modules/java/gen_java.py | 57 ++++++++++++------- 2 files changed, 35 insertions(+), 51 deletions(-) delete mode 100644 modules/java/android_test/src/org/opencv/test/ml/CvStatModelTest.java diff --git a/modules/java/android_test/src/org/opencv/test/ml/CvStatModelTest.java b/modules/java/android_test/src/org/opencv/test/ml/CvStatModelTest.java deleted file mode 100644 index a732bc5506..0000000000 --- a/modules/java/android_test/src/org/opencv/test/ml/CvStatModelTest.java +++ /dev/null @@ -1,29 +0,0 @@ -package org.opencv.test.ml; - -import org.opencv.ml.CvStatModel; - -import junit.framework.TestCase; - -public class CvStatModelTest extends TestCase { - - public void testCvStatModel() { - new CvStatModel(); - } - - public void testLoadString() { - fail("Not yet implemented"); - } - - public void testLoadStringString() { - fail("Not yet implemented"); - } - - public void testSaveString() { - fail("Not yet implemented"); - } - - public void testSaveStringString() { - fail("Not yet implemented"); - } - -} diff --git a/modules/java/gen_java.py b/modules/java/gen_java.py index f658ef55a9..eee82d4bc7 100644 --- a/modules/java/gen_java.py +++ b/modules/java/gen_java.py @@ -533,11 +533,11 @@ class ClassPropInfo(object): self.rw = "/RW" in decl[3] class ClassInfo(object): - def __init__(self, decl): # [ 'class/struct cname', [bases], [modlist] ] + def __init__(self, decl): # [ 'class/struct cname', ': base', [modlist] ] name = decl[0] name = name[name.find(" ")+1:].strip() self.cname = self.name = self.jname = re.sub(r"^cv\.", "", name) - self.cname =self.cname.replace(".", "::") + self.cname = self.cname.replace(".", "::") self.methods = {} self.methods_suffixes = {} self.consts = [] # using a list to save the occurence order @@ -548,6 +548,10 @@ class ClassInfo(object): for m in decl[2]: if m.startswith("="): self.jname = m[1:] + self.base = '' + if decl[1]: + self.base = re.sub(r"\b"+self.jname+r"\b", "", decl[1].replace(":", "")).strip() + class ArgInfo(object): @@ -613,7 +617,7 @@ class JavaWrapperGenerator(object): self.clear() def clear(self): - self.classes = { "Mat" : ClassInfo([ 'class Mat', [], [] ]) } + self.classes = { "Mat" : ClassInfo([ 'class Mat', '', [], [] ]) } self.module = "" self.Module = "" self.java_code= {} # { class : {j_code, jn_code} } @@ -624,11 +628,28 @@ class JavaWrapperGenerator(object): self.classes_map = [] self.classes_simple = [] - def add_class_code_stream(self, class_name): + def add_class_code_stream(self, class_name, cls_base = ''): jname = self.classes[class_name].jname self.java_code[class_name] = { "j_code" : StringIO(), "jn_code" : StringIO(), } if class_name != self.Module: - self.java_code[class_name]["j_code"].write(""" + if cls_base: + self.java_code[class_name]["j_code"].write(""" +// +// This file is auto-generated. Please don't modify it! +// +package org.opencv.%(m)s; + +$imports + +// C++: class %(c)s +//javadoc: %(c)s +public class %(jc)s extends %(base)s { + + protected %(jc)s(long addr) { super(addr); } + +""" % { 'm' : self.module, 'c' : class_name, 'jc' : jname, 'base' : cls_base }) + else: # not cls_base + self.java_code[class_name]["j_code"].write(""" // // This file is auto-generated. Please don't modify it! // @@ -643,8 +664,7 @@ public class %(jc)s { protected final long nativeObj; protected %(jc)s(long addr) { nativeObj = addr; } -""" % { 'm' : self.module, 'c' : class_name, 'jc' : jname } ) - +""" % { 'm' : self.module, 'c' : class_name, 'jc' : jname }) else: # class_name == self.Module self.java_code[class_name]["j_code"].write(""" // @@ -681,7 +701,7 @@ public class %(jc)s { return if '/Simple' in decl[2]: self.classes_simple.append(name) - if ('/Map' in decl[2]) or (name == 'CvStatModel'): + if ('/Map' in decl[2]): self.classes_map.append(name) #adding default c-tor ffi = FuncFamilyInfo(['cv.'+name+'.'+name, '', [], []]) @@ -713,7 +733,7 @@ public class %(jc)s { else: print "Skipped property: [%s]" % name, p - self.add_class_code_stream(name) + self.add_class_code_stream(name, classinfo.base) def add_const(self, decl): # [ "const cname", val, [], [] ] @@ -785,7 +805,7 @@ public class %(jc)s { self.Module = module.capitalize() parser = hdr_parser.CppHeaderParser() - self.add_class( ['class ' + self.Module, [], [], []] ) # [ 'class/struct cname', [bases], [modlist] [props] ] + self.add_class( ['class ' + self.Module, '', [], []] ) # [ 'class/struct cname', ':bases', [modlist] [props] ] # scan the headers and build more descriptive maps of classes, consts, functions for hdr in srcfiles: @@ -799,16 +819,6 @@ public class %(jc)s { else: # function self.add_func(decl) - #FIXME: BackgroundSubtractor is merged into BackgroundSubtractorMOG because of inheritance - if "BackgroundSubtractor" in self.classes: - bs = self.classes["BackgroundSubtractor"] - bsmog = self.classes["BackgroundSubtractorMOG"] - for name, mtd in bs.methods.items(): - for fn in mtd.funcs: - fn.classname = "BackgroundSubtractorMOG" - bsmog.methods[name] = mtd; - del self.classes["BackgroundSubtractor"] - self.cpp_code = StringIO() self.cpp_code.write(""" // @@ -1054,7 +1064,11 @@ extern "C" { ret_val = "" ret = "return;" elif ret_type == "": # c-tor - ret_val = "nativeObj = " + if fi.classname and self.classes[fi.classname].base: + ret_val = "super( " + tail = " )" + else: + ret_val = "nativeObj = " ret = "return;" elif ret_type in self.classes: # wrapped class ret_val = type_dict[ret_type]["j_type"] + " retVal = new " + self.classes[ret_type].jname + "(" @@ -1271,7 +1285,6 @@ JNIEXPORT $rtype JNICALL Java_org_opencv_${module}_${clazz}_$fname @Override protected void finalize() throws Throwable { delete(nativeObj); - super.finalize(); } """ )