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