for m in decl[2]:
if m.startswith("="):
self.jname = m[1:]
+ if m == '/Simple':
+ self.smart = False
+
self.base = ''
if decl[1]:
#self.base = re.sub(r"\b"+self.jname+r"\b", "", decl[1].replace(":", "")).strip()
def clear(self):
self.namespaces = ["cv"]
- self.classes = { "Mat" : ClassInfo([ 'class Mat', '', [], [] ], self.namespaces) }
+ self.classes = { "Mat" : ClassInfo([ 'class Mat', '', ['/Simple'], [] ], self.namespaces) }
self.module = ""
self.Module = ""
self.ported_func_list = []
if name in type_dict and not classinfo.base:
logging.warning('duplicated: %s', classinfo)
return
+ if self.isSmartClass(classinfo):
+ jni_name = "*((*(Ptr<"+classinfo.fullName(isCPP=True)+">*)%(n)s_nativeObj).get())"
+ else:
+ jni_name = "(*("+classinfo.fullName(isCPP=True)+"*)%(n)s_nativeObj)"
type_dict.setdefault(name, {}).update(
{ "j_type" : classinfo.jname,
"jn_type" : "long", "jn_args" : (("__int64", ".nativeObj"),),
- "jni_name" : "(*("+classinfo.fullName(isCPP=True)+"*)%(n)s_nativeObj)", "jni_type" : "jlong",
+ "jni_name" : jni_name,
+ "jni_type" : "jlong",
"suffix" : "J",
"j_import" : "org.opencv.%s.%s" % (self.module, classinfo.jname)
}
type_dict.setdefault(name+'*', {}).update(
{ "j_type" : classinfo.jname,
"jn_type" : "long", "jn_args" : (("__int64", ".nativeObj"),),
- "jni_name" : "("+classinfo.fullName(isCPP=True)+"*)%(n)s_nativeObj", "jni_type" : "jlong",
+ "jni_name" : "&("+jni_name+")",
+ "jni_type" : "jlong",
"suffix" : "J",
"j_import" : "org.opencv.%s.%s" % (self.module, classinfo.jname)
}
ret = "return env->NewStringUTF(_retval_.c_str());"
default = 'return env->NewStringUTF("");'
elif self.isWrapped(fi.ctype): # wrapped class:
- ret = "return (jlong) new %s(_retval_);" % self.fullTypeName(fi.ctype)
+ ret = None
+ if fi.ctype in self.classes:
+ ret_ci = self.classes[fi.ctype]
+ if self.isSmartClass(ret_ci):
+ ret = "return (jlong)(new Ptr<%(ctype)s>(new %(ctype)s(_retval_)));" % { 'ctype': self.fullTypeName(fi.ctype) }
+ if ret is None:
+ ret = "return (jlong) new %s(_retval_);" % self.fullTypeName(fi.ctype)
elif fi.ctype.startswith('Ptr_'):
c_prologue.append("typedef Ptr<%s> %s;" % (self.fullTypeName(fi.ctype[4:]), fi.ctype))
ret = "return (jlong)(new %(ctype)s(_retval_));" % { 'ctype':fi.ctype }
if ci.smart != None:
return ci.smart
- # if parents are smart (we hope) then children are!
- # if not we believe the class is smart if it has "create" method
- ci.smart = False
- if ci.base or ci.name == 'Algorithm':
- ci.smart = True
- else:
- for fi in ci.methods:
- if fi.name == "create":
- ci.smart = True
- break
-
+ ci.smart = True # smart class is not properly handled in case of base/derived classes
return ci.smart
def smartWrap(self, ci, fullname):