def _AddForwardDeclaration(self): """Add the content of the forward declaration to the dictionary.""" template = string.Template('JNI_REGISTRATION_EXPORT bool ${METHOD_NAME}(' 'JNIEnv* env);\n') value = { 'METHOD_NAME': jni_generator.GetRegistrationFunctionName( self.fully_qualified_class) } self.registration_dict['FORWARD_DECLARATIONS'] += template.substitute(value)
def _AddRegisterNativesCalls(self): """Add the body of the RegisterNativesImpl method to the dictionary.""" template = string.Template(""" if (!${REGISTER_NAME}(env)) return false; """) value = { 'REGISTER_NAME': jni_generator.GetRegistrationFunctionName( self.fully_qualified_class) } register_body = template.substitute(value) if self.main_dex: self._AppendToDict('REGISTER_MAIN_DEX_NATIVES', register_body) else: self._AppendToDict('REGISTER_NON_MAIN_DEX_NATIVES', register_body)
def _AddRegisterNativesFunctions(self): """Returns the code for RegisterNatives.""" natives = self._GetRegisterNativesImplString() if not natives: return '' template = string.Template("""\ JNI_REGISTRATION_EXPORT bool ${REGISTER_NAME}(JNIEnv* env) { ${NATIVES}\ return true; } """) values = { 'REGISTER_NAME': jni_generator.GetRegistrationFunctionName( self.fully_qualified_class), 'NATIVES': natives } self._SetDictValue('JNI_NATIVE_METHOD', template.substitute(values))
def _AddRegisterNativesCalls(self): """Add the body of the RegisterNativesImpl method to the dictionary.""" # Only register if there is at least 1 non-proxy native if len(self.non_proxy_natives) == 0: return '' template = string.Template("""\ if (!${REGISTER_NAME}(env)) return false; """) value = { 'REGISTER_NAME': jni_generator.GetRegistrationFunctionName(self.fully_qualified_class) } register_body = template.substitute(value) if self.main_dex: self._SetDictValue('REGISTER_MAIN_DEX_NATIVES', register_body) else: self._SetDictValue('REGISTER_NON_MAIN_DEX_NATIVES', register_body)
def _SetProxyRegistrationFields(registration_dict): registration_template = string.Template("""\ static const JNINativeMethod kMethods_${ESCAPED_PROXY_CLASS}[] = { ${KMETHODS} }; JNI_REGISTRATION_EXPORT bool ${REGISTRATION_NAME}(JNIEnv* env) { const int number_of_methods = arraysize(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; } """) registration_call = string.Template("""\ // Register natives in a proxy. if (!${REGISTRATION_NAME}(env)) { return false; } """) sub_dict = { 'ESCAPED_PROXY_CLASS': jni_generator.NativeProxyHelpers.ESCAPED_NATIVE_PROXY_CLASS, 'PROXY_CLASS': jni_generator.NATIVE_PROXY_QUALIFIED_NAME, 'KMETHODS': registration_dict['PROXY_NATIVE_METHOD_ARRAY'], 'REGISTRATION_NAME': jni_generator.GetRegistrationFunctionName( jni_generator.NATIVE_PROXY_QUALIFIED_NAME) } 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