You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
93 lines
2.8 KiB
93 lines
2.8 KiB
#!/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))
|