diff options
author | bulach@chromium.org <bulach@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-09-24 11:01:41 +0000 |
---|---|---|
committer | bulach@chromium.org <bulach@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-09-24 11:01:41 +0000 |
commit | 33cb2c35f919756202151c5b7f3650102fa79054 (patch) | |
tree | 7154038be79f39ebc2130a7cd80b3e14fed28284 /base/android | |
parent | 35661a695e81e104c978c6d66bdc31a4539388de (diff) | |
download | chromium_src-33cb2c35f919756202151c5b7f3650102fa79054.zip chromium_src-33cb2c35f919756202151c5b7f3650102fa79054.tar.gz chromium_src-33cb2c35f919756202151c5b7f3650102fa79054.tar.bz2 |
Android: generates JNI bindings for constructors in system classes.
This allows to simplify some places such as surface_texture_bridge.
BUG=
TEST=
Review URL: https://chromiumcodereview.appspot.com/10968009
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@158249 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base/android')
-rwxr-xr-x | base/android/jni_generator/jni_generator.py | 103 | ||||
-rwxr-xr-x | base/android/jni_generator/jni_generator_tests.py | 23 |
2 files changed, 91 insertions, 35 deletions
diff --git a/base/android/jni_generator/jni_generator.py b/base/android/jni_generator/jni_generator.py index 7f07320..6ae7bee 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', @@ -211,7 +215,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 + ';' @@ -299,21 +304,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): @@ -391,7 +406,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. @@ -409,27 +423,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) @@ -748,12 +778,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 @@ -771,8 +801,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: @@ -799,7 +829,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, @@ -876,16 +906,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) diff --git a/base/android/jni_generator/jni_generator_tests.py b/base/android/jni_generator/jni_generator_tests.py index 2d1188f..d833851 100755 --- a/base/android/jni_generator/jni_generator_tests.py +++ b/base/android/jni_generator/jni_generator_tests.py @@ -1175,7 +1175,7 @@ public abstract class java.io.InputStream extends java.lang.Object } """ jni_from_javap = jni_generator.JNIFromJavaP(contents.split('\n'), None) - self.assertEquals(9, len(jni_from_javap.called_by_natives)) + self.assertEquals(10, len(jni_from_javap.called_by_natives)) golden_content = """\ // Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be @@ -1338,6 +1338,18 @@ static jlong Java_InputStream_skip(JNIEnv* env, jobject obj, jlong p0) { return ret; } +static jmethodID g_InputStream_Constructor = 0; +static ScopedJavaLocalRef<jobject> Java_InputStream_Constructor(JNIEnv* env) { + /* Must call RegisterNativesImpl() */ + DCHECK(g_InputStream_clazz); + DCHECK(g_InputStream_Constructor); + jobject ret = + env->NewObject(g_InputStream_clazz, + g_InputStream_Constructor); + base::android::CheckException(env); + return ScopedJavaLocalRef<jobject>(env, ret); +} + // Step 3: GetMethodIDs and RegisterNatives. static void GetMethodIDsImpl(JNIEnv* env) { g_InputStream_clazz = reinterpret_cast<jclass>(env->NewGlobalRef( @@ -1429,6 +1441,15 @@ static void GetMethodIDsImpl(JNIEnv* env) { ")" "J"); + g_InputStream_Constructor = + base::android::GetMethodID( + env, g_InputStream_clazz, + "<init>", + +"(" +")" +"V"); + } static bool RegisterNativesImpl(JNIEnv* env) { |