OLD | NEW |
1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. |
3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
5 | 5 |
6 """Extracts native methods from a Java file and generates the JNI bindings. | 6 """Extracts native methods from a Java file and generates the JNI bindings. |
7 If you change this, please run and update the tests.""" | 7 If you change this, please run and update the tests.""" |
8 | 8 |
9 import collections | 9 import collections |
10 import errno | 10 import errno |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
131 # Checking just the start of the name, rather than a direct comparison, | 131 # Checking just the start of the name, rather than a direct comparison, |
132 # in order to handle generics. | 132 # in order to handle generics. |
133 return 'jclass' | 133 return 'jclass' |
134 else: | 134 else: |
135 return 'jobject' | 135 return 'jobject' |
136 | 136 |
137 | 137 |
138 def WrapCTypeForDeclaration(c_type): | 138 def WrapCTypeForDeclaration(c_type): |
139 """Wrap the C datatype in a JavaRef if required.""" | 139 """Wrap the C datatype in a JavaRef if required.""" |
140 if re.match(RE_SCOPED_JNI_TYPES, c_type): | 140 if re.match(RE_SCOPED_JNI_TYPES, c_type): |
141 return 'const JavaParamRef<' + c_type + '>&' | 141 return 'const base::android::JavaParamRef<' + c_type + '>&' |
142 else: | 142 else: |
143 return c_type | 143 return c_type |
144 | 144 |
145 | 145 |
146 def JavaDataTypeToCForDeclaration(java_type): | 146 def JavaDataTypeToCForDeclaration(java_type): |
147 """Returns a JavaRef-wrapped C datatype for the given java type.""" | 147 """Returns a JavaRef-wrapped C datatype for the given java type.""" |
148 return WrapCTypeForDeclaration(JavaDataTypeToC(java_type)) | 148 return WrapCTypeForDeclaration(JavaDataTypeToC(java_type)) |
149 | 149 |
150 | 150 |
151 def JavaDataTypeToCForCalledByNativeParam(java_type): | 151 def JavaDataTypeToCForCalledByNativeParam(java_type): |
(...skipping 799 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
951 | 951 |
952 java_name = self.fully_qualified_class.replace('_', '_1').replace('/', '_') | 952 java_name = self.fully_qualified_class.replace('_', '_1').replace('/', '_') |
953 if native.java_class_name: | 953 if native.java_class_name: |
954 java_name += '_00024' + native.java_class_name | 954 java_name += '_00024' + native.java_class_name |
955 | 955 |
956 values = {'NAME': native.name, | 956 values = {'NAME': native.name, |
957 'JAVA_NAME': java_name} | 957 'JAVA_NAME': java_name} |
958 return template.substitute(values) | 958 return template.substitute(values) |
959 | 959 |
960 def GetJavaParamRefForCall(self, c_type, name): | 960 def GetJavaParamRefForCall(self, c_type, name): |
961 return Template('JavaParamRef<${TYPE}>(env, ${NAME})').substitute({ | 961 return Template( |
| 962 'base::android::JavaParamRef<${TYPE}>(env, ${NAME})').substitute({ |
962 'TYPE': c_type, | 963 'TYPE': c_type, |
963 'NAME': name, | 964 'NAME': name, |
964 }) | 965 }) |
965 | 966 |
966 def GetJNIFirstParamForCall(self, native): | 967 def GetJNIFirstParamForCall(self, native): |
967 c_type = self.GetJNIFirstParamType(native) | 968 c_type = self.GetJNIFirstParamType(native) |
968 return [self.GetJavaParamRefForCall(c_type, 'jcaller')] | 969 return [self.GetJavaParamRefForCall(c_type, 'jcaller')] |
969 | 970 |
970 def GetNativeStub(self, native): | 971 def GetNativeStub(self, native): |
971 is_method = native.type == 'method' | 972 is_method = native.type == 'method' |
972 | 973 |
973 if is_method: | 974 if is_method: |
974 params = native.params[1:] | 975 params = native.params[1:] |
975 else: | 976 else: |
976 params = native.params | 977 params = native.params |
977 params_in_call = ['env'] + self.GetJNIFirstParamForCall(native) | 978 params_in_call = ['env'] + self.GetJNIFirstParamForCall(native) |
978 for p in params: | 979 for p in params: |
979 c_type = JavaDataTypeToC(p.datatype) | 980 c_type = JavaDataTypeToC(p.datatype) |
980 if re.match(RE_SCOPED_JNI_TYPES, c_type): | 981 if re.match(RE_SCOPED_JNI_TYPES, c_type): |
981 params_in_call.append(self.GetJavaParamRefForCall(c_type, p.name)) | 982 params_in_call.append(self.GetJavaParamRefForCall(c_type, p.name)) |
982 else: | 983 else: |
983 params_in_call.append(p.name) | 984 params_in_call.append(p.name) |
984 params_in_call = ', '.join(params_in_call) | 985 params_in_call = ', '.join(params_in_call) |
985 | 986 |
986 return_type = return_declaration = JavaDataTypeToC(native.return_type) | 987 return_type = return_declaration = JavaDataTypeToC(native.return_type) |
987 post_call = '' | 988 post_call = '' |
988 if re.match(RE_SCOPED_JNI_TYPES, return_type): | 989 if re.match(RE_SCOPED_JNI_TYPES, return_type): |
989 post_call = '.Release()' | 990 post_call = '.Release()' |
990 return_declaration = 'ScopedJavaLocalRef<' + return_type + '>' | 991 return_declaration = ('base::android::ScopedJavaLocalRef<' + return_type + |
| 992 '>') |
991 values = { | 993 values = { |
992 'RETURN': return_type, | 994 'RETURN': return_type, |
993 'RETURN_DECLARATION': return_declaration, | 995 'RETURN_DECLARATION': return_declaration, |
994 'NAME': native.name, | 996 'NAME': native.name, |
995 'PARAMS': self.GetParamsInDeclaration(native), | 997 'PARAMS': self.GetParamsInDeclaration(native), |
996 'PARAMS_IN_STUB': self.GetParamsInStub(native), | 998 'PARAMS_IN_STUB': self.GetParamsInStub(native), |
997 'PARAMS_IN_CALL': params_in_call, | 999 'PARAMS_IN_CALL': params_in_call, |
998 'POST_CALL': post_call, | 1000 'POST_CALL': post_call, |
999 'STUB_NAME': self.GetStubName(native), | 1001 'STUB_NAME': self.GetStubName(native), |
1000 } | 1002 } |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1064 return_type = JavaDataTypeToC(called_by_native.return_type) | 1066 return_type = JavaDataTypeToC(called_by_native.return_type) |
1065 optional_error_return = JavaReturnValueToC(called_by_native.return_type) | 1067 optional_error_return = JavaReturnValueToC(called_by_native.return_type) |
1066 if optional_error_return: | 1068 if optional_error_return: |
1067 optional_error_return = ', ' + optional_error_return | 1069 optional_error_return = ', ' + optional_error_return |
1068 return_declaration = '' | 1070 return_declaration = '' |
1069 return_clause = '' | 1071 return_clause = '' |
1070 if return_type != 'void': | 1072 if return_type != 'void': |
1071 pre_call = ' ' + pre_call | 1073 pre_call = ' ' + pre_call |
1072 return_declaration = return_type + ' ret =' | 1074 return_declaration = return_type + ' ret =' |
1073 if re.match(RE_SCOPED_JNI_TYPES, return_type): | 1075 if re.match(RE_SCOPED_JNI_TYPES, return_type): |
1074 return_type = 'ScopedJavaLocalRef<' + return_type + '>' | 1076 return_type = 'base::android::ScopedJavaLocalRef<' + return_type + '>' |
1075 return_clause = 'return ' + return_type + '(env, ret);' | 1077 return_clause = 'return ' + return_type + '(env, ret);' |
1076 else: | 1078 else: |
1077 return_clause = 'return ret;' | 1079 return_clause = 'return ret;' |
1078 return { | 1080 return { |
1079 'JAVA_CLASS': java_class, | 1081 'JAVA_CLASS': java_class, |
1080 'RETURN_TYPE': return_type, | 1082 'RETURN_TYPE': return_type, |
1081 'OPTIONAL_ERROR_RETURN': optional_error_return, | 1083 'OPTIONAL_ERROR_RETURN': optional_error_return, |
1082 'RETURN_DECLARATION': return_declaration, | 1084 'RETURN_DECLARATION': return_declaration, |
1083 'RETURN_CLAUSE': return_clause, | 1085 'RETURN_CLAUSE': return_clause, |
1084 'FIRST_PARAM_IN_DECLARATION': first_param_in_declaration, | 1086 'FIRST_PARAM_IN_DECLARATION': first_param_in_declaration, |
(...skipping 277 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1362 GenerateJNIHeader(input_file, output_file, options) | 1364 GenerateJNIHeader(input_file, output_file, options) |
1363 | 1365 |
1364 if options.depfile: | 1366 if options.depfile: |
1365 build_utils.WriteDepfile( | 1367 build_utils.WriteDepfile( |
1366 options.depfile, | 1368 options.depfile, |
1367 build_utils.GetPythonDependencies()) | 1369 build_utils.GetPythonDependencies()) |
1368 | 1370 |
1369 | 1371 |
1370 if __name__ == '__main__': | 1372 if __name__ == '__main__': |
1371 sys.exit(main(sys.argv)) | 1373 sys.exit(main(sys.argv)) |
OLD | NEW |