From 2b6753bdafd0cc54a0ec6c5cf2b65bf083fd6393 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Tue, 10 Oct 2017 12:51:10 +0200 Subject: [PATCH] Started jni part of java wrapper --- wrappers/java/genwrapper.py | 45 ++++++++++++++++++++++++++++++++----- 1 file changed, 39 insertions(+), 6 deletions(-) diff --git a/wrappers/java/genwrapper.py b/wrappers/java/genwrapper.py index 1d9829d3b..e4cf66589 100644 --- a/wrappers/java/genwrapper.py +++ b/wrappers/java/genwrapper.py @@ -65,7 +65,12 @@ ENUMS_LIST = { ########################################################################## class JavaTranslator(object): - def __init__(self): + def __init__(self, packageName): + package_dirs = packageName.split('.') + self.jni_package = '' + for directory in package_dirs: + self.jni_package += directory + '_' + self.docTranslator = metadoc.SandcastleJavaTranslator() def throws_exception(self, _type): @@ -77,7 +82,7 @@ class JavaTranslator(object): def translate_argument_name(self, _argName): return _argName.to_snake_case() - def translate_type(self, _type, native=False): + def translate_type(self, _type, native=False, jni=False): if type(_type) is AbsApi.ListType: ptrtype = '' if type(_type.containedTypeDesc) is AbsApi.ClassType: @@ -124,8 +129,8 @@ class JavaTranslator(object): return 'void' return _type.name - def translate_argument(self, _arg, native=False): - return '{0} {1}'.format(self.translate_type(_arg.type, native), self.translate_argument_name(_arg.name)) + def translate_argument(self, _arg, native=False, jni=False): + return '{0} {1}'.format(self.translate_type(_arg.type, native, jni), self.translate_argument_name(_arg.name)) def translate_property(self, _property): properties = [] @@ -135,6 +140,14 @@ class JavaTranslator(object): properties.append(self.translate_method(_property.setter)) return properties + def translate_jni_property(self, _property): + properties = [] + if _property.getter is not None: + properties.append(self.translate_jni_method(_property.getter)) + if _property.setter is not None: + properties.append(self.translate_jni_method(_property.setter)) + return properties + def translate_method(self, _method): methodDict = {} @@ -186,10 +199,25 @@ class JavaTranslator(object): return methodDict + def translate_jni_method(self, _method): + methodDict = {} + + methodDict['return'] = self.translate_type(_method.returnType, jni=True) + methodDict['name'] = 'Java_' + self.jni_package + _method.parent.name.to_camel_case() + 'Impl_' + _method.name.to_camel_case(lower=True) + + methodDict['params'] = 'JNIEnv *env, jobject thiz' + for arg in _method.args: + if arg is not _method.args[0]: + methodDict['params'] += ', ' + methodDict['params'] += self.translate_argument(arg, jni=True) + + return methodDict + def translate_class(self, _class): classDict = { 'methods' : [], 'staticMethods' : [], + 'jniMethods' : [], } classDict['isLinphoneFactory'] = _class.name.to_camel_case() == "Factory" @@ -198,20 +226,25 @@ class JavaTranslator(object): for _property in _class.properties: try: classDict['methods'] += self.translate_property(_property) + classDict['jniMethods'] += self.translate_jni_property(_property) except AbsApi.Error as e: print('error while translating {0} property: {1}'.format(_property.name.to_snake_case(), e.args[0])) for method in _class.instanceMethods: try: methodDict = self.translate_method(method) + jniMethodDict = self.translate_jni_method(method) classDict['methods'].append(methodDict) + classDict['jniMethods'].append(jniMethodDict) except AbsApi.Error as e: print('Could not translate {0}: {1}'.format(method.name.to_snake_case(fullName=True), e.args[0])) for method in _class.classMethods: try: methodDict = self.translate_method(method) + jniMethodDict = self.translate_jni_method(method) classDict['staticMethods'].append(methodDict) + classDict['jniMethods'].append(jniMethodDict) except AbsApi.Error as e: print('Could not translate {0}: {1}'.format(method.name.to_snake_case(fullName=True), e.args[0])) @@ -301,8 +334,8 @@ class JavaClass(object): self.imports = [] self.methods = self._class['methods'] self.staticMethods = self._class['staticMethods'] + self.jniMethods = self._class['jniMethods'] self.doc = self._class['doc'] - self.jniMethods = [] self.enums = [] def add_enum(self, enum): @@ -331,7 +364,7 @@ class GenWrapper(object): self.parser = AbsApi.CParser(project) self.parser.parse_all() - self.translator = JavaTranslator() + self.translator = JavaTranslator(package) self.renderer = pystache.Renderer() self.jni = Jni()