summaryrefslogtreecommitdiffstats
path: root/base/android
diff options
context:
space:
mode:
authorbulach@chromium.org <bulach@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-09-24 11:01:41 +0000
committerbulach@chromium.org <bulach@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-09-24 11:01:41 +0000
commit33cb2c35f919756202151c5b7f3650102fa79054 (patch)
tree7154038be79f39ebc2130a7cd80b3e14fed28284 /base/android
parent35661a695e81e104c978c6d66bdc31a4539388de (diff)
downloadchromium_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-xbase/android/jni_generator/jni_generator.py103
-rwxr-xr-xbase/android/jni_generator/jni_generator_tests.py23
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) {