def _SubstituteNativeMethods(self, template, sub_proxy=False): """Substitutes NAMESPACE, JAVA_CLASS and KMETHODS in the provided template.""" ret = [] all_classes = self.helper.GetUniqueClasses(self.natives) all_classes[self.class_name] = self.fully_qualified_class for clazz, full_clazz in all_classes.iteritems(): if not sub_proxy: if clazz == jni_generator.NATIVE_PROXY_CLASS_NAME: continue kmethods = self._GetKMethodsString(clazz) namespace_str = '' if self.namespace: namespace_str = self.namespace + '::' if kmethods: values = { 'NAMESPACE': namespace_str, 'JAVA_CLASS': jni_generator.EscapeClassName(full_clazz), 'KMETHODS': kmethods } ret += [template.substitute(values)] if not ret: return '' return '\n'.join(ret)
def _SetProxyRegistrationFields(registration_dict, use_hash): registration_template = string.Template("""\ static const JNINativeMethod kMethods_${ESCAPED_PROXY_CLASS}[] = { ${KMETHODS} }; namespace { JNI_REGISTRATION_EXPORT bool ${REGISTRATION_NAME}(JNIEnv* env) { const int number_of_methods = base::size(kMethods_${ESCAPED_PROXY_CLASS}); base::android::ScopedJavaLocalRef<jclass> native_clazz = base::android::GetClass(env, "${PROXY_CLASS}"); if (env->RegisterNatives( native_clazz.obj(), kMethods_${ESCAPED_PROXY_CLASS}, number_of_methods) < 0) { jni_generator::HandleRegistrationError(env, native_clazz.obj(), __FILE__); return false; } return true; } } // namespace """) registration_call = string.Template("""\ // Register natives in a proxy. if (!${REGISTRATION_NAME}(env)) { return false; } """) sub_dict = { 'ESCAPED_PROXY_CLASS': jni_generator.EscapeClassName( jni_generator.ProxyHelpers.GetQualifiedClass(use_hash)), 'PROXY_CLASS': jni_generator.ProxyHelpers.GetQualifiedClass(use_hash), 'KMETHODS': registration_dict['PROXY_NATIVE_METHOD_ARRAY'], 'REGISTRATION_NAME': jni_generator.GetRegistrationFunctionName( jni_generator.ProxyHelpers.GetQualifiedClass(use_hash)), } if registration_dict['PROXY_NATIVE_METHOD_ARRAY']: proxy_native_array = registration_template.substitute(sub_dict) proxy_natives_registration = registration_call.substitute(sub_dict) else: proxy_native_array = '' proxy_natives_registration = '' if registration_dict['PROXY_NATIVE_METHOD_ARRAY_MAIN_DEX']: sub_dict['REGISTRATION_NAME'] += 'MAIN_DEX' sub_dict['ESCAPED_PROXY_CLASS'] += 'MAIN_DEX' sub_dict['KMETHODS'] = ( registration_dict['PROXY_NATIVE_METHOD_ARRAY_MAIN_DEX']) proxy_native_array += registration_template.substitute(sub_dict) main_dex_call = registration_call.substitute(sub_dict) else: main_dex_call = '' registration_dict['PROXY_NATIVE_METHOD_ARRAY'] = proxy_native_array registration_dict['REGISTER_PROXY_NATIVES'] = proxy_natives_registration registration_dict['REGISTER_MAIN_DEX_PROXY_NATIVES'] = main_dex_call