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

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

Issue 472553002: Make class lookup lazy in jni_generator when using lazy method lookup. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 4 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
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 88332fafd04bb8afc0526de8a3cf58e2fa5d7879..b06f49fe6a9bfeafe3009d03567fd0496a6543cd 100755
--- a/base/android/jni_generator/jni_generator.py
+++ b/base/android/jni_generator/jni_generator.py
@@ -1122,11 +1122,11 @@ static ${RETURN} ${NAME}(JNIEnv* env, ${PARAMS_IN_DECLARATION}) {"""
def GetCalledByNativeValues(self, called_by_native):
"""Fills in necessary values for the CalledByNative methods."""
+ java_class = called_by_native.java_class_name or self.class_name
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
- self.class_name))
+ first_param_in_call = self.GetClazzVariableNameTemplate().substitute({
+ 'JAVA_CLASS': java_class })
else:
first_param_in_declaration = ', jobject obj'
first_param_in_call = 'obj'
@@ -1160,7 +1160,7 @@ static ${RETURN} ${NAME}(JNIEnv* env, ${PARAMS_IN_DECLARATION}) {"""
else:
return_clause = 'return ret;'
return {
- 'JAVA_CLASS': called_by_native.java_class_name or self.class_name,
+ 'JAVA_CLASS': java_class,
'RETURN_TYPE': return_type,
'OPTIONAL_ERROR_RETURN': optional_error_return,
'RETURN_DECLARATION': return_declaration,
@@ -1199,12 +1199,19 @@ ${FUNCTION_SIGNATURE} {""")
function_header_with_unused_template = Template("""\
${FUNCTION_SIGNATURE} __attribute__ ((unused));
${FUNCTION_SIGNATURE} {""")
+ if self.options.native_exports:
+ local_clazz_init_template = Template("""
+ jclass clazz =
+ base::android::LazyGetClass(env, k${JAVA_CLASS}ClassPath, \
+ &g_${JAVA_CLASS}_clazz); """)
+ else:
+ local_clazz_init_template = Template("")
template = Template("""
static base::subtle::AtomicWord g_${JAVA_CLASS}_${METHOD_ID_VAR_NAME} = 0;
${FUNCTION_HEADER}
- /* Must call RegisterNativesImpl() */
+ /* Must call RegisterNativesImpl() */${LOCAL_CLAZZ_INIT}
CHECK_CLAZZ(env, ${FIRST_PARAM_IN_CALL},
- g_${JAVA_CLASS}_clazz${OPTIONAL_ERROR_RETURN});
+ ${CLAZZ_VARIABLE_NAME}${OPTIONAL_ERROR_RETURN});
jmethodID method_id =
${GET_METHOD_ID_IMPL}
${RETURN_DECLARATION}
@@ -1216,6 +1223,10 @@ ${FUNCTION_HEADER}
values = self.GetCalledByNativeValues(called_by_native)
values['FUNCTION_SIGNATURE'] = (
function_signature_template.substitute(values))
+ values['LOCAL_CLAZZ_INIT'] = (
+ local_clazz_init_template.substitute(values))
+ values['CLAZZ_VARIABLE_NAME'] = (
+ self.GetClazzVariableNameTemplate().substitute(values))
if called_by_native.system_class:
values['FUNCTION_HEADER'] = (
function_header_with_unused_template.substitute(values))
@@ -1223,6 +1234,12 @@ ${FUNCTION_HEADER}
values['FUNCTION_HEADER'] = function_header_template.substitute(values)
return template.substitute(values)
+ def GetClazzVariableNameTemplate(self):
+ if self.options.native_exports:
+ return Template('clazz')
+ else:
+ return Template('g_${JAVA_CLASS}_clazz')
+
def GetKMethodArrayEntry(self, native):
template = Template("""\
{ "native${NAME}", ${JNI_SIGNATURE}, reinterpret_cast<void*>(${NAME}) },""")
@@ -1263,18 +1280,28 @@ const char k${JAVA_CLASS}ClassPath[] = "${JNI_CLASS_PATH}";""")
}
ret += [template.substitute(values)]
ret += ''
- for clazz in called_by_native_classes:
- template = Template("""\
+
+ java_class_global_type = 'jclass'
+ java_class_global_init = 'NULL'
+ if self.options.native_exports:
+ java_class_global_type = 'base::subtle::AtomicWord'
+ java_class_global_init = '0'
+ template = Template("""\
// Leaking this jclass as we cannot use LazyInstance from some threads.
-jclass g_${JAVA_CLASS}_clazz = NULL;""")
+${JAVA_CLASS_GLOBAL_TYPE} g_${JAVA_CLASS}_clazz = ${JAVA_CLASS_GLOBAL_INIT};""")
+ for clazz in called_by_native_classes:
values = {
'JAVA_CLASS': clazz,
+ 'JAVA_CLASS_GLOBAL_TYPE': java_class_global_type,
+ 'JAVA_CLASS_GLOBAL_INIT': java_class_global_init,
}
ret += [template.substitute(values)]
return '\n'.join(ret)
def GetFindClasses(self):
"""Returns the imlementation of FindClass for all known classes."""
+ if self.options.native_exports:
+ return '\n'
if self.init_native:
template = Template("""\
g_${JAVA_CLASS}_clazz = static_cast<jclass>(env->NewWeakGlobalRef(clazz));""")
@@ -1293,13 +1320,13 @@ jclass g_${JAVA_CLASS}_clazz = NULL;""")
if self.options.eager_called_by_natives:
template = Template("""\
env->Get${STATIC_METHOD_PART}MethodID(
- g_${JAVA_CLASS}_clazz,
+ ${CLAZZ_VARIABLE_NAME},
"${JNI_NAME}", ${JNI_SIGNATURE});""")
else:
template = Template("""\
base::android::MethodID::LazyGet<
base::android::MethodID::TYPE_${STATIC}>(
- env, g_${JAVA_CLASS}_clazz,
+ env, ${CLAZZ_VARIABLE_NAME},
"${JNI_NAME}",
${JNI_SIGNATURE},
&g_${JAVA_CLASS}_${METHOD_ID_VAR_NAME});
@@ -1323,6 +1350,9 @@ env->Get${STATIC_METHOD_PART}MethodID(
'STATIC_METHOD_PART': 'Static' if called_by_native.static else '',
'JNI_SIGNATURE': signature,
}
+ values['CLAZZ_VARIABLE_NAME'] = (
+ self.GetClazzVariableNameTemplate().substitute(values))
+
return template.substitute(values)

Powered by Google App Engine
This is Rietveld 408576698