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