| #!/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)) |