#!/usr/bin/env python3 # # Copyright (C) 2019 The Android Open Source Project # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # import sys DEFAULT_TYPES_TO_JNI = { "boolean": "Z", "byte": "B", "char": "C", "short": "S", "int": "I", "long": "J", "float": "F", "double": "D", "void": "V", "String": "Ljava/lang/String;" } class AIDLMalformedSignatureException(Exception): """Line containing AIDL signature is invalid""" def convert_type(aidl_type): if aidl_type.endswith("[]"): return "[" + convert_type(aidl_type[:-2]) if aidl_type in DEFAULT_TYPES_TO_JNI: return DEFAULT_TYPES_TO_JNI[aidl_type] elif aidl_type.startswith("List<") | aidl_type.startswith("java.util.List<"): return "Ljava/util/List;" else: return "L" + aidl_type.replace(".", "/") + ";" def convert_method(aidl_signature): aidl_signature = aidl_signature.split("|") if len(aidl_signature) != 4: raise AIDLMalformedSignatureException() class_name, method_name, args, return_type = aidl_signature # Filter out empty arguments since there will be trailing commas args = [x for x in args.split(",") if x] jni_signature = convert_type(class_name) jni_signature += "->" jni_signature += method_name jni_signature += "(" params = [convert_type(x) for x in args] jni_signature += "".join(params) jni_signature += ")" jni_signature += convert_type(return_type) return jni_signature def main(argv): if len(argv) != 3: print("Usage: %s <aidl-mappings> <jni-signature-mappings>" % argv[0]) return -1 aidl_mappings, jni_signature_mappings = argv[1:] line_index = 0 skip_line = False with open(aidl_mappings) as input_file: with open(jni_signature_mappings, "w") as output_file: for line in input_file: if skip_line: skip_line = False elif line_index % 2 == 1: output_file.write(line) else: try: stripped_line = line.strip() output_file.write(convert_method(line.strip())) output_file.write("\n") except AIDLMalformedSignatureException: print("Malformed signature %s . Skipping..." % stripped_line) # The next line contains the location, need to skip it skip_line = True line_index += 1 if __name__ == "__main__": sys.exit(main(sys.argv))