Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(246)

Unified Diff: base/android/jni_generator/jni_generator.py

Issue 10968009: Android: generates JNI bindings for constructors in system classes. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: jam comment Created 8 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | base/android/jni_generator/jni_generator_tests.py » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 1b9bf84e761e8ad9d1e718ffc3a2267d548e2a0e..5f576322563a7c048515c9973a3d9cb231d38466 100755
--- a/base/android/jni_generator/jni_generator.py
+++ b/base/android/jni_generator/jni_generator.py
@@ -78,10 +78,13 @@ class CalledByNative(object):
self.static = kwargs['static']
self.java_class_name = kwargs['java_class_name']
self.return_type = kwargs['return_type']
- self.env_call = kwargs['env_call']
self.name = kwargs['name']
self.params = kwargs['params']
self.method_id_var_name = kwargs.get('method_id_var_name', None)
+ self.is_constructor = kwargs.get('is_constructor', False)
+ self.env_call = GetEnvCall(self.is_constructor, self.static,
+ self.return_type)
+ self.static_cast = GetStaticCastForReturnType(self.return_type)
def JavaDataTypeToC(java_type):
@@ -137,6 +140,7 @@ def JavaParamToJni(param):
'Landroid/graphics/RectF',
'Landroid/graphics/Matrix',
'Landroid/graphics/Point',
+ 'Landroid/graphics/SurfaceTexture$OnFrameAvailableListener',
'Landroid/os/Message',
'Landroid/view/KeyEvent',
'Landroid/view/Surface',
@@ -209,7 +213,8 @@ def JavaParamToJni(param):
return prefix + pod_param_map[param]
for qualified_name in object_param_list + app_param_list:
if (qualified_name.endswith('/' + param) or
- qualified_name.endswith('$' + param.replace('.', '$'))):
+ qualified_name.endswith('$' + param.replace('.', '$')) or
+ qualified_name == 'L' + param):
return prefix + qualified_name + ';'
else:
return UNKNOWN_JAVA_TYPE_PREFIX + prefix + param + ';'
@@ -297,21 +302,31 @@ def ExtractNatives(contents):
return natives
-def GetEnvCallForReturnType(return_type):
+def GetStaticCastForReturnType(return_type):
+ if return_type == 'String':
+ return 'jstring'
+ return None
+
+
+def GetEnvCall(is_constructor, is_static, return_type):
"""Maps the types availabe via env->Call__Method."""
- env_call_map = {'boolean': ('Boolean', ''),
- 'byte': ('Byte', ''),
- 'char': ('Char', ''),
- 'short': ('Short', ''),
- 'int': ('Int', ''),
- 'long': ('Long', ''),
- 'float': ('Float', ''),
- 'void': ('Void', ''),
- 'double': ('Double', ''),
- 'String': ('Object', 'jstring'),
- 'Object': ('Object', ''),
+ if is_constructor:
+ return 'NewObject'
+ env_call_map = {'boolean': 'Boolean',
+ 'byte': 'Byte',
+ 'char': 'Char',
+ 'short': 'Short',
+ 'int': 'Int',
+ 'long': 'Long',
+ 'float': 'Float',
+ 'void': 'Void',
+ 'double': 'Double',
+ 'Object': 'Object',
}
- return env_call_map.get(return_type, ('Object', ''))
+ call = env_call_map.get(return_type, 'Object')
+ if is_static:
+ call = 'Static' + call
+ return 'Call' + call + 'Method'
def GetMangledMethodName(name, jni_signature):
@@ -389,7 +404,6 @@ def ExtractCalledByNatives(contents):
static='static' in match.group('prefix'),
java_class_name=match.group('annotation') or '',
return_type=match.group('return_type'),
- env_call=GetEnvCallForReturnType(match.group('return_type')),
name=match.group('name'),
params=ParseParams(match.group('params')))]
# Check for any @CalledByNative occurrences that weren't matched.
@@ -407,27 +421,43 @@ class JNIFromJavaP(object):
def __init__(self, contents, namespace):
self.contents = contents
self.namespace = namespace
- self.fully_qualified_class = re.match('.*?class (.*?) ',
- contents[1]).group(1)
+ self.fully_qualified_class = re.match('.*?class (?P<class_name>.*?) ',
+ contents[1]).group('class_name')
self.fully_qualified_class = self.fully_qualified_class.replace('.', '/')
self.java_class_name = self.fully_qualified_class.split('/')[-1]
if not self.namespace:
self.namespace = 'JNI_' + self.java_class_name
- re_method = re.compile('(.*?)(\w+?) (\w+?)\((.*?)\)')
+ re_method = re.compile('(?P<prefix>.*?)(?P<return_type>\w+?) (?P<name>\w+?)'
+ '\((?P<params>.*?)\)')
self.called_by_natives = []
- for method in contents[2:]:
- match = re.match(re_method, method)
+ for content in contents[2:]:
+ match = re.match(re_method, content)
if not match:
continue
self.called_by_natives += [CalledByNative(
system_class=True,
unchecked=False,
- static='static' in match.group(1),
+ static='static' in match.group('prefix'),
+ java_class_name='',
+ return_type=match.group('return_type'),
+ name=match.group('name'),
+ params=ParseParams(match.group('params').replace('.', '/')))]
+ re_constructor = re.compile('.*? public ' +
+ self.fully_qualified_class.replace('/', '.') +
+ '\((?P<params>.*?)\)')
+ for content in contents[2:]:
+ match = re.match(re_constructor, content)
+ if not match:
+ continue
+ self.called_by_natives += [CalledByNative(
+ system_class=False,
+ unchecked=False,
+ static=False,
java_class_name='',
- return_type=match.group(2),
- name=match.group(3),
- params=ParseParams(match.group(4)),
- env_call=GetEnvCallForReturnType(match.group(2)))]
+ return_type=self.fully_qualified_class,
+ name='Constructor',
+ params=ParseParams(match.group('params').replace('.', '/')),
+ is_constructor=True)]
self.called_by_natives = MangleCalledByNatives(self.called_by_natives)
self.inl_header_file_generator = InlHeaderFileGenerator(
self.namespace, self.fully_qualified_class, [], self.called_by_natives)
@@ -746,12 +776,12 @@ ${FUNCTION_HEADER}
DCHECK(g_${JAVA_CLASS}_clazz);
DCHECK(g_${JAVA_CLASS}_${METHOD_ID_VAR_NAME});
${RETURN_DECLARATION}
- ${PRE_CALL}env->Call${STATIC}${ENV_CALL}Method(${FIRST_PARAM_IN_CALL},
+ ${PRE_CALL}env->${ENV_CALL}(${FIRST_PARAM_IN_CALL},
g_${JAVA_CLASS}_${METHOD_ID_VAR_NAME}${PARAMS_IN_CALL})${POST_CALL};
${CHECK_EXCEPTION}
${RETURN_CLAUSE}
}""")
- if called_by_native.static:
+ if called_by_native.static or called_by_native.is_constructor:
first_param_in_declaration = ''
first_param_in_call = ('g_%s_clazz' %
(called_by_native.java_class_name or
@@ -769,8 +799,8 @@ ${FUNCTION_HEADER}
params_for_call = ', ' + params_for_call
pre_call = ''
post_call = ''
- if called_by_native.env_call[1]:
- pre_call = 'static_cast<%s>(' % called_by_native.env_call[1]
+ if called_by_native.static_cast:
+ pre_call = 'static_cast<%s>(' % called_by_native.static_cast
post_call = ')'
check_exception = ''
if not called_by_native.unchecked:
@@ -797,7 +827,7 @@ ${FUNCTION_HEADER}
'STATIC': 'Static' if called_by_native.static else '',
'PRE_CALL': pre_call,
'POST_CALL': post_call,
- 'ENV_CALL': called_by_native.env_call[0],
+ 'ENV_CALL': called_by_native.env_call,
'FIRST_PARAM_IN_CALL': first_param_in_call,
'PARAMS_IN_CALL': params_for_call,
'METHOD_ID_VAR_NAME': called_by_native.method_id_var_name,
@@ -874,16 +904,21 @@ jclass g_${JAVA_CLASS}_clazz = NULL;""")
g_${JAVA_CLASS}_${METHOD_ID_VAR_NAME} =
base::android::Get${STATIC}MethodID(
env, g_${JAVA_CLASS}_clazz,
- "${NAME}",
+ "${JNI_NAME}",
${JNI_SIGNATURE});
""")
+ jni_name = called_by_native.name
+ jni_return_type = called_by_native.return_type
+ if called_by_native.is_constructor:
+ jni_name = '<init>'
+ jni_return_type = 'void'
values = {
'JAVA_CLASS': called_by_native.java_class_name or self.class_name,
- 'NAME': called_by_native.name,
+ 'JNI_NAME': jni_name,
'METHOD_ID_VAR_NAME': called_by_native.method_id_var_name,
'STATIC': 'Static' if called_by_native.static else '',
'JNI_SIGNATURE': JniSignature(called_by_native.params,
- called_by_native.return_type,
+ jni_return_type,
True)
}
return template.substitute(values)
« no previous file with comments | « no previous file | base/android/jni_generator/jni_generator_tests.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698