Index: base/android/jni_generator/jni_generator.py |
diff --git a/base/android/jni_generator/jni_generator.py b/base/android/jni_generator/jni_generator.py |
index 207bda83aef74fd245e397826f42c5c277c10622..d0a332653ac933d856c6361ab4b445893fdc1477 100755 |
--- a/base/android/jni_generator/jni_generator.py |
+++ b/base/android/jni_generator/jni_generator.py |
@@ -889,114 +889,86 @@ def WrapOutput(output): |
return '\n'.join(ret) |
-def ExtractInputFiles(jar_file, input_files, out_dirs): |
- """Extracts input files from jar and returns them as list of filenames. |
+def ExtractJarInputFile(jar_file, input_file, out_dir): |
+ """Extracts input file from jar and returns the filename. |
- The input files are extracted to the same directory that the generated jni |
+ The input file is extracted to the same directory that the generated jni |
headers will be placed in. This is passed as an argument to script. |
Args: |
- jar_file: the jar file containing the input files to extract |
- input_files: the list of files to extract from the jar file |
- out_dirs: the name of the directories to extract to |
+ jar_file: the jar file containing the input files to extract. |
+ input_files: the list of files to extract from the jar file. |
+ out_dir: the name of the directories to extract to. |
Returns: |
- a list of file names of extracted input files |
+ the name of extracted input file. |
""" |
jar_file = zipfile.ZipFile(jar_file) |
- extracted_file_names = [] |
- |
- for (input_file, out_dir) in zip(input_files, out_dirs): |
- out_dir = os.path.join(out_dir, os.path.dirname(input_file)) |
- if not os.path.exists(out_dir): |
- os.makedirs(out_dir) |
- extracted_file_name = os.path.join(out_dir, os.path.basename(input_file)) |
- with open(extracted_file_name, 'w') as outfile: |
- outfile.write(jar_file.read(input_file)) |
- extracted_file_names.append(extracted_file_name) |
- |
- return extracted_file_names |
- |
- |
-def GenerateJNIHeaders(input_files, output_files, namespace): |
- for i in xrange(len(input_files)): |
- try: |
- if os.path.splitext(input_files[i])[1] == '.class': |
- jni_from_javap = JNIFromJavaP.CreateFromClass(input_files[i], namespace) |
- output = jni_from_javap.GetContent() |
- else: |
- jni_from_java_source = JNIFromJavaSource.CreateFromFile(input_files[i]) |
- output = jni_from_java_source.GetContent() |
- except ParseError, e: |
- print e |
- sys.exit(1) |
- if output_files: |
- header_name = output_files[i] |
- if not os.path.exists(os.path.dirname(os.path.abspath(header_name))): |
- os.makedirs(os.path.dirname(os.path.abspath(header_name))) |
- if (not os.path.exists(header_name) or |
- file(header_name).read() != output): |
- output_file = file(header_name, 'w') |
- output_file.write(output) |
- output_file.close() |
+ |
+ out_dir = os.path.join(out_dir, os.path.dirname(input_file)) |
+ if not os.path.exists(out_dir): |
+ os.makedirs(out_dir) |
+ extracted_file_name = os.path.join(out_dir, os.path.basename(input_file)) |
+ with open(extracted_file_name, 'w') as outfile: |
+ outfile.write(jar_file.read(input_file)) |
+ |
+ return extracted_file_name |
+ |
+ |
+def GenerateJNIHeader(input_file, output_file, namespace): |
+ try: |
+ if os.path.splitext(input_file)[1] == '.class': |
+ jni_from_javap = JNIFromJavaP.CreateFromClass(input_file, namespace) |
+ content = jni_from_javap.GetContent() |
else: |
- print output |
- |
- |
-def CheckFilenames(input_files, output_files): |
- """Make sure the input and output have consistent names.""" |
- if len(input_files) != len(output_files): |
- sys.exit('Input files length %d must match output length %d' % |
- (len(input_files), len(output_files))) |
- for i in xrange(len(input_files)): |
- input_prefix = os.path.splitext(os.path.basename(input_files[i]))[0] |
- output_prefix = os.path.splitext(os.path.basename(output_files[i]))[0] |
- if input_prefix.lower() + 'jni' != output_prefix.replace('_', '').lower(): |
- sys.exit('\n'.join([ |
- '*** Error ***', |
- 'Input and output files have inconsistent names:', |
- '\t' + os.path.basename(input_files[i]), |
- '\t' + os.path.basename(output_files[i]), |
- '', |
- 'Input "FooBar.java" must be converted to output "foo_bar_jni.h"', |
- '', |
- ])) |
+ jni_from_java_source = JNIFromJavaSource.CreateFromFile(input_file) |
+ content = jni_from_java_source.GetContent() |
+ except ParseError, e: |
+ print e |
+ sys.exit(1) |
+ if output_file: |
+ if not os.path.exists(os.path.dirname(os.path.abspath(output_file))): |
+ os.makedirs(os.path.dirname(os.path.abspath(output_file))) |
+ with file(output_file, 'w') as f: |
+ f.write(content) |
+ else: |
+ print output |
def main(argv): |
- usage = """usage: %prog [OPTION] file1[ file2...] [output1[ output2...]] |
+ usage = """usage: %prog [OPTIONS] |
This script will parse the given java source code extracting the native |
declarations and print the header file to stdout (or a file). |
See SampleForTests.java for more details. |
""" |
option_parser = optparse.OptionParser(usage=usage) |
- option_parser.add_option('-o', dest='output_files', |
- action='store_true', |
- default=False, |
- help='Saves the output to file(s) (the first half of' |
- ' args specify the java input files, the second' |
- ' half specify the header output files.') |
option_parser.add_option('-j', dest='jar_file', |
help='Extract the list of input files from' |
' a specified jar file.' |
' Uses javap to extract the methods from a' |
- ' pre-compiled class. Input files should point' |
+ ' pre-compiled class. --input should point' |
' to pre-compiled Java .class files.') |
option_parser.add_option('-n', dest='namespace', |
help='Uses as a namespace in the generated header,' |
' instead of the javap class name.') |
+ option_parser.add_option('--input_file', |
+ help='Single input file name. The output file name ' |
+ 'will be derived from it. Must be used with ' |
+ '--output_dir.') |
+ option_parser.add_option('--output_dir', |
+ help='The output directory. Must be used with ' |
+ '--input') |
options, args = option_parser.parse_args(argv) |
- input_files = args[1:] |
- output_files = [] |
- if options.output_files: |
- output_files = input_files[len(input_files) / 2:] |
- input_files = input_files[:len(input_files) / 2] |
- CheckFilenames(input_files, output_files) |
if options.jar_file: |
- # CheckFileNames guarantees same length for inputs and outputs |
- out_dirs = map(os.path.dirname, output_files) |
- input_files = ExtractInputFiles(options.jar_file, input_files, out_dirs) |
- GenerateJNIHeaders(input_files, output_files, options.namespace) |
+ input_file = ExtractJarInputFile(options.jar_file, options.input_file, |
+ options.output_dir) |
+ else: |
+ input_file = options.input_file |
+ output_file = None |
+ if options.output_dir: |
+ root_name = os.path.splitext(os.path.basename(input_file))[0] |
+ output_file = os.path.join(options.output_dir, root_name) + '_jni.h' |
+ GenerateJNIHeader(input_file, output_file, options.namespace) |
if __name__ == '__main__': |