Exemple #1
0
  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