| OLD | NEW |
| 1 #!/usr/bin/python | 1 #!/usr/bin/python |
| 2 # | 2 # |
| 3 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 3 # Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 4 # Use of this source code is governed by a BSD-style license that can be | 4 # Use of this source code is governed by a BSD-style license that can be |
| 5 # found in the LICENSE file. | 5 # found in the LICENSE file. |
| 6 | 6 |
| 7 """Extracts native methods from a Java file and generates the JNI bindings. | 7 """Extracts native methods from a Java file and generates the JNI bindings. |
| 8 If you change this, please run and update the tests.""" | 8 If you change this, please run and update the tests.""" |
| 9 | 9 |
| 10 import collections | 10 import collections |
| (...skipping 587 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 598 return '\n'.join(ret) | 598 return '\n'.join(ret) |
| 599 | 599 |
| 600 def GetRegisterNativesImplString(self): | 600 def GetRegisterNativesImplString(self): |
| 601 """Returns the implementation for RegisterNatives.""" | 601 """Returns the implementation for RegisterNatives.""" |
| 602 template = Template("""\ | 602 template = Template("""\ |
| 603 static const JNINativeMethod kMethods${JAVA_CLASS}[] = { | 603 static const JNINativeMethod kMethods${JAVA_CLASS}[] = { |
| 604 ${KMETHODS} | 604 ${KMETHODS} |
| 605 }; | 605 }; |
| 606 const int kMethods${JAVA_CLASS}Size = arraysize(kMethods${JAVA_CLASS}); | 606 const int kMethods${JAVA_CLASS}Size = arraysize(kMethods${JAVA_CLASS}); |
| 607 | 607 |
| 608 if (env->RegisterNatives(g_${JAVA_CLASS}_clazz.obj(), | 608 if (env->RegisterNatives(g_${JAVA_CLASS}_clazz, |
| 609 kMethods${JAVA_CLASS}, | 609 kMethods${JAVA_CLASS}, |
| 610 kMethods${JAVA_CLASS}Size) < 0) { | 610 kMethods${JAVA_CLASS}Size) < 0) { |
| 611 LOG(ERROR) << "RegisterNatives failed in " << __FILE__; | 611 LOG(ERROR) << "RegisterNatives failed in " << __FILE__; |
| 612 return false; | 612 return false; |
| 613 } | 613 } |
| 614 """) | 614 """) |
| 615 ret = [] | 615 ret = [] |
| 616 all_classes = self.GetUniqueClasses(self.natives) | 616 all_classes = self.GetUniqueClasses(self.natives) |
| 617 all_classes[self.class_name] = self.fully_qualified_class | 617 all_classes[self.class_name] = self.fully_qualified_class |
| 618 for clazz in all_classes: | 618 for clazz in all_classes: |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 717 JNIEnv* env${FIRST_PARAM_IN_DECLARATION}${PARAMS_IN_DECLARATION})""") | 717 JNIEnv* env${FIRST_PARAM_IN_DECLARATION}${PARAMS_IN_DECLARATION})""") |
| 718 function_header_template = Template("""\ | 718 function_header_template = Template("""\ |
| 719 ${FUNCTION_SIGNATURE} {""") | 719 ${FUNCTION_SIGNATURE} {""") |
| 720 function_header_with_unused_template = Template("""\ | 720 function_header_with_unused_template = Template("""\ |
| 721 ${FUNCTION_SIGNATURE} __attribute__ ((unused)); | 721 ${FUNCTION_SIGNATURE} __attribute__ ((unused)); |
| 722 ${FUNCTION_SIGNATURE} {""") | 722 ${FUNCTION_SIGNATURE} {""") |
| 723 template = Template(""" | 723 template = Template(""" |
| 724 static jmethodID g_${JAVA_CLASS}_${METHOD_ID_VAR_NAME} = 0; | 724 static jmethodID g_${JAVA_CLASS}_${METHOD_ID_VAR_NAME} = 0; |
| 725 ${FUNCTION_HEADER} | 725 ${FUNCTION_HEADER} |
| 726 /* Must call RegisterNativesImpl() */ | 726 /* Must call RegisterNativesImpl() */ |
| 727 DCHECK(!g_${JAVA_CLASS}_clazz.is_null()); | 727 DCHECK(g_${JAVA_CLASS}_clazz); |
| 728 DCHECK(g_${JAVA_CLASS}_${METHOD_ID_VAR_NAME}); | 728 DCHECK(g_${JAVA_CLASS}_${METHOD_ID_VAR_NAME}); |
| 729 ${RETURN_DECLARATION} | 729 ${RETURN_DECLARATION} |
| 730 ${PRE_CALL}env->Call${STATIC}${ENV_CALL}Method(${FIRST_PARAM_IN_CALL}, | 730 ${PRE_CALL}env->Call${STATIC}${ENV_CALL}Method(${FIRST_PARAM_IN_CALL}, |
| 731 g_${JAVA_CLASS}_${METHOD_ID_VAR_NAME}${PARAMS_IN_CALL})${POST_CALL}; | 731 g_${JAVA_CLASS}_${METHOD_ID_VAR_NAME}${PARAMS_IN_CALL})${POST_CALL}; |
| 732 ${CHECK_EXCEPTION} | 732 ${CHECK_EXCEPTION} |
| 733 ${RETURN_CLAUSE} | 733 ${RETURN_CLAUSE} |
| 734 }""") | 734 }""") |
| 735 if called_by_native.static: | 735 if called_by_native.static: |
| 736 first_param_in_declaration = '' | 736 first_param_in_declaration = '' |
| 737 first_param_in_call = ('g_%s_clazz.obj()' % | 737 first_param_in_call = ('g_%s_clazz' % |
| 738 (called_by_native.java_class_name or | 738 (called_by_native.java_class_name or |
| 739 self.class_name)) | 739 self.class_name)) |
| 740 else: | 740 else: |
| 741 first_param_in_declaration = ', jobject obj' | 741 first_param_in_declaration = ', jobject obj' |
| 742 first_param_in_call = 'obj' | 742 first_param_in_call = 'obj' |
| 743 params_in_declaration = self.GetCalledByNativeParamsInDeclaration( | 743 params_in_declaration = self.GetCalledByNativeParamsInDeclaration( |
| 744 called_by_native) | 744 called_by_native) |
| 745 if params_in_declaration: | 745 if params_in_declaration: |
| 746 params_in_declaration = ', ' + params_in_declaration | 746 params_in_declaration = ', ' + params_in_declaration |
| 747 params_for_call = ', '.join(param.name | 747 params_for_call = ', '.join(param.name |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 809 if entry.java_class_name: | 809 if entry.java_class_name: |
| 810 class_name = entry.java_class_name | 810 class_name = entry.java_class_name |
| 811 jni_class_path = self.fully_qualified_class + '$' + class_name | 811 jni_class_path = self.fully_qualified_class + '$' + class_name |
| 812 ret[class_name] = jni_class_path | 812 ret[class_name] = jni_class_path |
| 813 return ret | 813 return ret |
| 814 | 814 |
| 815 def GetClassPathDefinitions(self): | 815 def GetClassPathDefinitions(self): |
| 816 """Returns the ClassPath constants.""" | 816 """Returns the ClassPath constants.""" |
| 817 ret = [] | 817 ret = [] |
| 818 template = Template("""\ | 818 template = Template("""\ |
| 819 const char* const k${JAVA_CLASS}ClassPath = "${JNI_CLASS_PATH}";""") | 819 const char k${JAVA_CLASS}ClassPath[] = "${JNI_CLASS_PATH}";""") |
| 820 native_classes = self.GetUniqueClasses(self.natives) | 820 native_classes = self.GetUniqueClasses(self.natives) |
| 821 called_by_native_classes = self.GetUniqueClasses(self.called_by_natives) | 821 called_by_native_classes = self.GetUniqueClasses(self.called_by_natives) |
| 822 all_classes = native_classes | 822 all_classes = native_classes |
| 823 all_classes.update(called_by_native_classes) | 823 all_classes.update(called_by_native_classes) |
| 824 for clazz in all_classes: | 824 for clazz in all_classes: |
| 825 values = { | 825 values = { |
| 826 'JAVA_CLASS': clazz, | 826 'JAVA_CLASS': clazz, |
| 827 'JNI_CLASS_PATH': all_classes[clazz], | 827 'JNI_CLASS_PATH': all_classes[clazz], |
| 828 } | 828 } |
| 829 ret += [template.substitute(values)] | 829 ret += [template.substitute(values)] |
| 830 ret += '' | 830 ret += '' |
| 831 for clazz in called_by_native_classes: | 831 for clazz in called_by_native_classes: |
| 832 template = Template("""\ | 832 template = Template("""\ |
| 833 // Leaking this JavaRef as we cannot use LazyInstance from some threads. | 833 // Leaking this jclass as we cannot use LazyInstance from some threads. |
| 834 base::android::ScopedJavaGlobalRef<jclass>& | 834 jclass g_${JAVA_CLASS}_clazz = NULL;""") |
| 835 g_${JAVA_CLASS}_clazz = | |
| 836 *(new base::android::ScopedJavaGlobalRef<jclass>());""") | |
| 837 values = { | 835 values = { |
| 838 'JAVA_CLASS': clazz, | 836 'JAVA_CLASS': clazz, |
| 839 } | 837 } |
| 840 ret += [template.substitute(values)] | 838 ret += [template.substitute(values)] |
| 841 return '\n'.join(ret) | 839 return '\n'.join(ret) |
| 842 | 840 |
| 843 def GetFindClasses(self): | 841 def GetFindClasses(self): |
| 844 """Returns the imlementation of FindClass for all known classes.""" | 842 """Returns the imlementation of FindClass for all known classes.""" |
| 845 template = Template("""\ | 843 template = Template("""\ |
| 846 g_${JAVA_CLASS}_clazz.Reset( | 844 g_${JAVA_CLASS}_clazz = reinterpret_cast<jclass>(env->NewGlobalRef( |
| 847 base::android::GetClass(env, k${JAVA_CLASS}ClassPath));""") | 845 base::android::GetUnscopedClass(env, k${JAVA_CLASS}ClassPath)));""") |
| 848 ret = [] | 846 ret = [] |
| 849 for clazz in self.GetUniqueClasses(self.called_by_natives): | 847 for clazz in self.GetUniqueClasses(self.called_by_natives): |
| 850 values = {'JAVA_CLASS': clazz} | 848 values = {'JAVA_CLASS': clazz} |
| 851 ret += [template.substitute(values)] | 849 ret += [template.substitute(values)] |
| 852 return '\n'.join(ret) | 850 return '\n'.join(ret) |
| 853 | 851 |
| 854 def GetMethodIDImpl(self, called_by_native): | 852 def GetMethodIDImpl(self, called_by_native): |
| 855 """Returns the implementation of GetMethodID.""" | 853 """Returns the implementation of GetMethodID.""" |
| 856 template = Template("""\ | 854 template = Template("""\ |
| 857 g_${JAVA_CLASS}_${METHOD_ID_VAR_NAME} = base::android::Get${STATIC}MethodID( | 855 g_${JAVA_CLASS}_${METHOD_ID_VAR_NAME} = |
| 858 env, g_${JAVA_CLASS}_clazz, | 856 base::android::Get${STATIC}MethodID( |
| 859 "${NAME}", | 857 env, g_${JAVA_CLASS}_clazz, |
| 860 ${JNI_SIGNATURE}); | 858 "${NAME}", |
| 859 ${JNI_SIGNATURE}); |
| 861 """) | 860 """) |
| 862 values = { | 861 values = { |
| 863 'JAVA_CLASS': called_by_native.java_class_name or self.class_name, | 862 'JAVA_CLASS': called_by_native.java_class_name or self.class_name, |
| 864 'NAME': called_by_native.name, | 863 'NAME': called_by_native.name, |
| 865 'METHOD_ID_VAR_NAME': called_by_native.method_id_var_name, | 864 'METHOD_ID_VAR_NAME': called_by_native.method_id_var_name, |
| 866 'STATIC': 'Static' if called_by_native.static else '', | 865 'STATIC': 'Static' if called_by_native.static else '', |
| 867 'JNI_SIGNATURE': JniSignature(called_by_native.params, | 866 'JNI_SIGNATURE': JniSignature(called_by_native.params, |
| 868 called_by_native.return_type, | 867 called_by_native.return_type, |
| 869 True) | 868 True) |
| 870 } | 869 } |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 963 if options.output_files: | 962 if options.output_files: |
| 964 output_files = input_files[len(input_files) / 2:] | 963 output_files = input_files[len(input_files) / 2:] |
| 965 input_files = input_files[:len(input_files) / 2] | 964 input_files = input_files[:len(input_files) / 2] |
| 966 CheckFilenames(input_files, output_files) | 965 CheckFilenames(input_files, output_files) |
| 967 GenerateJNIHeaders(input_files, output_files, options.javap_class, | 966 GenerateJNIHeaders(input_files, output_files, options.javap_class, |
| 968 options.namespace) | 967 options.namespace) |
| 969 | 968 |
| 970 | 969 |
| 971 if __name__ == '__main__': | 970 if __name__ == '__main__': |
| 972 sys.exit(main(sys.argv)) | 971 sys.exit(main(sys.argv)) |
| OLD | NEW |