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

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..a1d8790e24559d604900069efdb6fab22b0cf853 100755
--- a/base/android/jni_generator/jni_generator.py
+++ b/base/android/jni_generator/jni_generator.py
@@ -731,7 +731,7 @@ class InlHeaderFileGenerator(object):
def GetContent(self):
"""Returns the content of the JNI binding file."""
template = Template("""\
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -947,11 +947,11 @@ ${CALLED_BY_NATIVES}
template = Template("""\
const int kMethods${JAVA_CLASS}Size = arraysize(kMethods${JAVA_CLASS});
- if (env->RegisterNatives(g_${JAVA_CLASS}_clazz,
+ if (env->RegisterNatives(${JAVA_CLASS}_clazz(env),
kMethods${JAVA_CLASS},
kMethods${JAVA_CLASS}Size) < 0) {
jni_generator::HandleRegistrationError(
- env, g_${JAVA_CLASS}_clazz, __FILE__);
+ env, ${JAVA_CLASS}_clazz(env), __FILE__);
return false;
}
""")
@@ -1122,11 +1122,10 @@ 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 = ('%s_clazz(env)' % java_class)
else:
first_param_in_declaration = ', jobject obj'
first_param_in_call = 'obj'
@@ -1160,7 +1159,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,
@@ -1204,7 +1203,7 @@ static base::subtle::AtomicWord g_${JAVA_CLASS}_${METHOD_ID_VAR_NAME} = 0;
${FUNCTION_HEADER}
/* Must call RegisterNativesImpl() */
CHECK_CLAZZ(env, ${FIRST_PARAM_IN_CALL},
- g_${JAVA_CLASS}_clazz${OPTIONAL_ERROR_RETURN});
+ ${JAVA_CLASS}_clazz(env)${OPTIONAL_ERROR_RETURN});
jmethodID method_id =
${GET_METHOD_ID_IMPL}
${RETURN_DECLARATION}
@@ -1263,22 +1262,56 @@ const char k${JAVA_CLASS}ClassPath[] = "${JNI_CLASS_PATH}";""")
}
ret += [template.substitute(values)]
ret += ''
- for clazz in called_by_native_classes:
+
+ class_getter_methods = []
+ if self.options.native_exports:
template = Template("""\
// Leaking this jclass as we cannot use LazyInstance from some threads.
-jclass g_${JAVA_CLASS}_clazz = NULL;""")
+base::subtle::AtomicWord g_${JAVA_CLASS}_clazz = 0;
+jclass ${JAVA_CLASS}_clazz(JNIEnv* env) {
+ return base::android::LazyGetClass(env, k${JAVA_CLASS}ClassPath, \
+ &g_${JAVA_CLASS}_clazz);
+}""")
+ else:
+ template = Template("""\
+// Leaking this jclass as we cannot use LazyInstance from some threads.
+jclass g_${JAVA_CLASS}_clazz = NULL;
+jclass ${JAVA_CLASS}_clazz(JNIEnv*) { return g_${JAVA_CLASS}_clazz; }""")
+
+ for clazz in called_by_native_classes:
values = {
'JAVA_CLASS': clazz,
}
- ret += [template.substitute(values)]
+ class_getter_methods += [template.substitute(values)]
+
+ template = Template("""\
+#if __clang__
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wunused-function"
+#endif
+${CLASS_GETER_METHODS}
+#if __clang__
+#pragma clang diagnostic pop
+#endif""")
+ values = {
+ 'CLASS_GETER_METHODS': '\n'.join(class_getter_methods)
+ }
+ ret += [template.substitute(values)]
return '\n'.join(ret)
def GetFindClasses(self):
"""Returns the imlementation of FindClass for all known classes."""
if self.init_native:
- template = Template("""\
+ if self.options.native_exports:
+ template = Template("""\
+ base::subtle::Release_Store(&g_${JAVA_CLASS}_clazz,
+ static_cast<base::subtle::AtomicWord>(env->NewWeakGlobalRef(clazz));""")
+ else:
+ template = Template("""\
g_${JAVA_CLASS}_clazz = static_cast<jclass>(env->NewWeakGlobalRef(clazz));""")
else:
+ if self.options.native_exports:
+ return '\n'
template = Template("""\
g_${JAVA_CLASS}_clazz = reinterpret_cast<jclass>(env->NewGlobalRef(
base::android::GetClass(env, k${JAVA_CLASS}ClassPath).obj()));""")
@@ -1293,13 +1326,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,
+ ${JAVA_CLASS}_clazz(env),
"${JNI_NAME}", ${JNI_SIGNATURE});""")
else:
template = Template("""\
base::android::MethodID::LazyGet<
base::android::MethodID::TYPE_${STATIC}>(
- env, g_${JAVA_CLASS}_clazz,
+ env, ${JAVA_CLASS}_clazz(env),
"${JNI_NAME}",
${JNI_SIGNATURE},
&g_${JAVA_CLASS}_${METHOD_ID_VAR_NAME});
« no previous file with comments | « base/android/jni_generator/golden_sample_for_tests_jni.h ('k') | base/android/jni_generator/testCalledByNatives.golden » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698