Index: base/android/jni_generator/jni_generator.py |
diff --git a/base/android/jni_generator/jni_generator.py b/base/android/jni_generator/jni_generator.py |
index d2a7d0686cb2d4e14e9740f06c6d694279106b65..782e76a6611abe063e5a3164b4fdc88d59ae509d 100755 |
--- a/base/android/jni_generator/jni_generator.py |
+++ b/base/android/jni_generator/jni_generator.py |
@@ -76,6 +76,7 @@ class CalledByNative(object): |
self.name = kwargs['name'] |
self.params = kwargs['params'] |
self.method_id_var_name = kwargs.get('method_id_var_name', None) |
+ self.signature = kwargs.get('signature') |
self.is_constructor = kwargs.get('is_constructor', False) |
self.env_call = GetEnvCall(self.is_constructor, self.static, |
self.return_type) |
@@ -141,6 +142,11 @@ class JniParams(object): |
inner] |
@staticmethod |
+ def ParseJavaPSignature(signature_line): |
+ prefix = 'Signature: ' |
+ return '"%s"' % signature_line[signature_line.index(prefix) + len(prefix):] |
+ |
+ @staticmethod |
def JavaToJni(param): |
"""Converts a java param into a JNI signature type.""" |
pod_param_map = { |
@@ -466,7 +472,7 @@ class JNIFromJavaP(object): |
re_method = re.compile('(?P<prefix>.*?)(?P<return_type>\S+?) (?P<name>\w+?)' |
'\((?P<params>.*?)\)') |
self.called_by_natives = [] |
- for content in contents[2:]: |
+ for lineno, content in enumerate(contents[2:], 2): |
match = re.match(re_method, content) |
if not match: |
continue |
@@ -477,11 +483,12 @@ class JNIFromJavaP(object): |
java_class_name='', |
return_type=match.group('return_type').replace('.', '/'), |
name=match.group('name'), |
- params=JniParams.Parse(match.group('params').replace('.', '/')))] |
- re_constructor = re.compile('.*? public ' + |
+ params=JniParams.Parse(match.group('params').replace('.', '/')), |
+ signature=JniParams.ParseJavaPSignature(contents[lineno + 1]))] |
+ re_constructor = re.compile('(.*?)public ' + |
self.fully_qualified_class.replace('/', '.') + |
'\((?P<params>.*?)\)') |
- for content in contents[2:]: |
+ for lineno, content in enumerate(contents[2:], 2): |
match = re.match(re_constructor, content) |
if not match: |
continue |
@@ -493,6 +500,7 @@ class JNIFromJavaP(object): |
return_type=self.fully_qualified_class, |
name='Constructor', |
params=JniParams.Parse(match.group('params').replace('.', '/')), |
+ signature=JniParams.ParseJavaPSignature(contents[lineno + 1]), |
is_constructor=True)] |
self.called_by_natives = MangleCalledByNatives(self.called_by_natives) |
self.inl_header_file_generator = InlHeaderFileGenerator( |
@@ -505,7 +513,7 @@ class JNIFromJavaP(object): |
@staticmethod |
def CreateFromClass(class_file, options): |
class_name = os.path.splitext(os.path.basename(class_file))[0] |
- p = subprocess.Popen(args=['javap', class_name], |
+ p = subprocess.Popen(args=['javap', '-s', class_name], |
cwd=os.path.dirname(class_file), |
stdout=subprocess.PIPE, |
stderr=subprocess.PIPE) |
@@ -931,14 +939,18 @@ jclass g_${JAVA_CLASS}_clazz = NULL;""") |
if called_by_native.is_constructor: |
jni_name = '<init>' |
jni_return_type = 'void' |
+ if called_by_native.signature: |
+ signature = called_by_native.signature |
+ else: |
+ signature = JniParams.Signature(called_by_native.params, |
+ jni_return_type, |
+ True) |
values = { |
'JAVA_CLASS': called_by_native.java_class_name or self.class_name, |
'JNI_NAME': jni_name, |
'METHOD_ID_VAR_NAME': called_by_native.method_id_var_name, |
'STATIC': 'STATIC' if called_by_native.static else 'INSTANCE', |
- 'JNI_SIGNATURE': JniParams.Signature(called_by_native.params, |
- jni_return_type, |
- True) |
+ 'JNI_SIGNATURE': signature, |
} |
return template.substitute(values) |