Commit 4df98f2c authored by Andrey Pavlenko's avatar Andrey Pavlenko

Java API generator: class properties support added

parent 6b789dd2
......@@ -209,15 +209,21 @@ class ConstInfo(object):
self.value = val
class ClassPropInfo(object):
def __init__(self, decl): # [f_ctype, f_name, '', '/RW']
self.ctype = decl[0]
self.name = decl[1]
self.rw = "/RW" in decl[3]
class ClassInfo(object):
def __init__(self, decl): # [ 'class/struct cname', [bases], [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.jname = re.sub(r"^Cv", "", self.jname)
self.methods = {}
self.consts = [] # using a list to save the occurence order
self.props= []
for m in decl[2]:
if m.startswith("="):
self.jname = m[1:]
......@@ -351,17 +357,12 @@ public class %s {
"jni_name" : "(*("+classinfo.name+"*)%(n)s_nativeObj)", "jni_type" : "jlong",
"suffix" : "J" }
# set/get for class fileds
for f in decl[3]: # [f_ctype, f_name, '', '/RW']
# getter
getter_name = classinfo.name + ".get" + f[1][0].upper() + f[1][1:]
print getter_name
#self.add_func( [getter_name, f[0], [], []] ) # [ funcname, return_ctype, [modifiers], [args] ]
if "/RW" in f[3]:
#setter
setter_name = classinfo.name + ".set" + f[1][0].upper() + f[1][1:]
print setter_name
#self.add_func( [ setter_name, "void", [], [ [f[0], f[1], "", [], ""] ] ] )
# class props
for p in decl[3]:
if "vector" not in p[0]:
classinfo.props.append( ClassPropInfo(p) )
else:
print "Skipped proprty: [%s]" % classinfo.name, p
self.add_class_code_stream(classinfo.name)
......@@ -713,9 +714,18 @@ JNIEXPORT jdoubleArray JNICALL Java_org_opencv_core_Core_n_1getTextSize
if a.defval:
s += " = "+a.defval
decl_args.append(s)
c_decl = "%s %s %s(%s)" % ( fi.static, fi.ctype, fi.cname, ", ".join(decl_args) )
#java doc comment
f_name = fi.name
if fi.classname:
f_name = fi.classname + "::" + fi.name
java_doc = "//javadoc: " + f_name + "(%s)" % ", ".join([a.name for a in fi.args])
self.gen_func2(fi, isoverload, c_decl, java_doc, "")
def gen_func2(self, fi, isoverload, c_decl, java_doc, prop_name):
j_code = self.java_code[self.Module]["j_code"]
jn_code = self.java_code[self.Module]["jn_code"]
cpp_code = self.cpp_code
......@@ -829,12 +839,10 @@ JNIEXPORT jdoubleArray JNICALL Java_org_opencv_core_Core_n_1getTextSize
# java part:
#java doc comment
f_name = fi.name
if fi.classname:
f_name = fi.classname + "::" + fi.name
j_code.write(" //javadoc: " + f_name + "(%s)\n" % \
", ".join([a.name for a in args])
)
## f_name = fi.name
## if fi.classname:
## f_name = fi.classname + "::" + fi.name
j_code.write(" "*4 + java_doc + "\n")
# public java wrapper method impl (calling native one above)
# e.g.
......@@ -902,7 +910,15 @@ JNIEXPORT jdoubleArray JNICALL Java_org_opencv_core_Core_n_1getTextSize
elif type_dict[fi.ctype]["jni_type"] == "jdoubleArray":
ret = "return _da_retval_;"
cvname = "cv::" + fi.name
# hack: replacing func call with property set/get
name = fi.name
if prop_name:
if args:
name = prop_name + " = "
else:
name = prop_name + ";//"
cvname = "cv::" + name
retval = fi.ctype + " _retval_ = "
if fi.ctype == "void":
retval = ""
......@@ -911,9 +927,9 @@ JNIEXPORT jdoubleArray JNICALL Java_org_opencv_core_Core_n_1getTextSize
retval = fi.classname + "* _retval_ = "
cvname = "new " + fi.classname
elif fi.static:
cvname = "%s::%s" % (fi.classname, fi.name)
cvname = "%s::%s" % (fi.classname, name)
else:
cvname = "me->" + fi.name
cvname = "me->" + name
c_prologue.append(\
"%(cls)s* me = (%(cls)s*) self; //TODO: check for NULL" \
% { "cls" : fi.classname} \
......@@ -1013,16 +1029,28 @@ JNIEXPORT $rtype JNICALL Java_org_opencv_${module}_${clazz}_$fname
if not ffi.isconstructor:
for fi in ffi.funcs:
self.gen_func(fi, len(ffi.funcs)>1)
# props
for pi in ci.props:
# getter
getter_name = name + ".get_" + pi.name
#print getter_name
fi = FuncInfo( [getter_name, pi.ctype, [], []] ) # [ funcname, return_ctype, [modifiers], [args] ]
self.gen_func2(fi, getter_name in ci.methods, "// %s %s" % (pi.ctype, pi.name), "//javadoc: %s::%s" % (name, pi.name), pi.name)
if pi.rw:
#setter
setter_name = name + ".set_" + pi.name
#print setter_name
fi = FuncInfo( [ setter_name, "void", [], [ [pi.ctype, pi.name, "", [], ""] ] ] )
self.gen_func2(fi, getter_name in ci.methods, "// %s %s" % (pi.ctype, pi.name), "//javadoc: %s::%s" % (name, pi.name), pi.name)
# finalize()
self.java_code[name]["j_code"].write(
"""
@Override
protected void finalize() throws Throwable {
n_delete(nativeObj);
super.finalize();
}
@Override
protected void finalize() throws Throwable {
n_delete(nativeObj);
super.finalize();
}
""" )
self.java_code[name]["jn_code"].write(
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment