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) |