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