| # Copyright 2014 The Chromium Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| import("config.gni") |
| import("internal_rules.gni") |
| |
| # Declare a jni target |
| # |
| # This target generates the native jni bindings for a set of .java files. |
| # |
| # See base/android/jni_generator/jni_generator.py for more info about the |
| # format of generating JNI bindings. |
| # |
| # Variables |
| # sources: list of .java files to generate jni for |
| # jni_package: subdirectory path for generated bindings |
| # |
| # Example |
| # generate_jni("foo_jni") { |
| # sources = [ |
| # "android/java/src/org/chromium/foo/Foo.java", |
| # "android/java/src/org/chromium/foo/FooUtil.java", |
| # ] |
| # jni_package = "foo" |
| # } |
| template("generate_jni") { |
| assert(defined(invoker.sources)) |
| assert(defined(invoker.jni_package)) |
| jni_package = invoker.jni_package |
| base_output_dir = "${root_gen_dir}/${target_name}/${jni_package}" |
| jni_output_dir = "${base_output_dir}/jni" |
| |
| jni_generator_include = "//base/android/jni_generator/jni_generator_helper.h" |
| |
| foreach_target_name = "${target_name}__jni_gen" |
| action_foreach(foreach_target_name) { |
| script = "//base/android/jni_generator/jni_generator.py" |
| sources = invoker.sources |
| source_prereqs = [ jni_generator_include ] |
| outputs = [ |
| "${jni_output_dir}/{{source_name_part}}_jni.h" |
| ] |
| |
| args = [ |
| "--input_file={{source}}", |
| "--optimize_generation=1", |
| "--ptr_type=long", |
| "--output_dir", rebase_path(jni_output_dir, root_build_dir), |
| "--includes", rebase_path(jni_generator_include, "//"), |
| ] |
| if (defined(invoker.jni_generator_jarjar_file)) { |
| args += [ |
| "--jarjar", rebase_path(jni_generator_jarjar_file, root_build_dir), |
| ] |
| } |
| } |
| |
| config("jni_includes_${target_name}") { |
| include_dirs = [ base_output_dir ] |
| } |
| |
| group(target_name) { |
| deps = [ ":$foreach_target_name" ] |
| direct_dependent_configs = [ ":jni_includes_${target_name}" ] |
| |
| if (defined(invoker.deps)) { |
| deps += invoker.deps |
| } |
| if (defined(invoker.forward_dependent_configs_from)) { |
| forward_dependent_configs_from = invoker.forward_dependent_configs_from |
| } |
| } |
| } |
| |
| |
| # Declare a jni target for a prebuilt jar |
| # |
| # This target generates the native jni bindings for a set of classes in a .jar. |
| # |
| # See base/android/jni_generator/jni_generator.py for more info about the |
| # format of generating JNI bindings. |
| # |
| # Variables |
| # classes: list of .class files in the jar to generate jni for. These should |
| # include the full path to the .class file. |
| # jni_package: subdirectory path for generated bindings |
| # jar_file: the path to the .jar. If not provided, will default to the sdk's |
| # android.jar |
| # |
| # Example |
| # generate_jar_jni("foo_jni") { |
| # classes = [ |
| # "android/view/Foo.class", |
| # ] |
| # jni_package = "foo" |
| # } |
| template("generate_jar_jni") { |
| assert(defined(invoker.classes)) |
| assert(defined(invoker.jni_package)) |
| |
| if (defined(invoker.jar_file)) { |
| jar_file = invoker.jar_file |
| } else { |
| jar_file = android_sdk_jar |
| } |
| |
| jni_package = invoker.jni_package |
| base_output_dir = "${root_gen_dir}/${target_name}/${jni_package}" |
| jni_output_dir = "${base_output_dir}/jni" |
| |
| jni_generator_include = |
| rebase_path("//base/android/jni_generator/jni_generator_helper.h", |
| root_build_dir) |
| |
| # TODO(cjhopman): make jni_generator.py support generating jni for multiple |
| # .class files from a .jar. |
| jni_actions = [] |
| foreach(class, invoker.classes) { |
| classname_list = process_file_template( |
| [class], "{{source_name_part}}") |
| classname = classname_list[0] |
| jni_target_name = "${target_name}__jni_${classname}" |
| jni_actions += [ ":$jni_target_name" ] |
| action(jni_target_name) { |
| script = "//base/android/jni_generator/jni_generator.py" |
| sources = [ |
| jni_generator_include, |
| jar_file, |
| ] |
| outputs = [ |
| "${jni_output_dir}/${classname}_jni.h" |
| ] |
| |
| args = [ |
| "--jar_file", rebase_path(jar_file, root_build_dir), |
| "--input_file", class, |
| "--optimize_generation=1", |
| "--ptr_type=long", |
| "--output_dir", rebase_path(jni_output_dir, root_build_dir), |
| "--includes", rebase_path(jni_generator_include, "//"), |
| ] |
| } |
| } |
| |
| config("jni_includes_${target_name}") { |
| include_dirs = [ base_output_dir ] |
| } |
| |
| group(target_name) { |
| deps = jni_actions |
| if (defined(invoker.deps)) { |
| deps += invoker.deps |
| } |
| if (defined(invoker.forward_dependent_configs_from)) { |
| forward_dependent_configs_from = invoker.forward_dependent_configs_from |
| } |
| direct_dependent_configs = [ ":jni_includes_${target_name}" ] |
| } |
| } |
| |
| # Declare a target for c-preprocessor-generated java files |
| # |
| # This target generates java files using the host C pre-processor. Each file in |
| # sources will be compiled using the C pre-processor. If include_path is |
| # specified, it will be passed (with --I) to the pre-processor. |
| # |
| # This target will create a single .srcjar. Adding this target to a library |
| # target's srcjar_deps will make the generated java files be included in that |
| # library's final outputs. |
| # |
| # Variables |
| # sources: list of files to be processed by the C pre-processor. For each |
| # file in sources, there will be one .java file in the final .srcjar. For a |
| # file named FooBar.template, a java file will be created with name |
| # FooBar.java. |
| # source_prereqs: additional compile-time dependencies. Any files |
| # `#include`-ed in the templates should be listed here. |
| # package_name: this will be the subdirectory for each .java file in the .srcjar. |
| # |
| # Example |
| # java_cpp_template("foo_generated_enum") { |
| # sources = [ |
| # "android/java/templates/Foo.template", |
| # ] |
| # source_prereqs = [ |
| # "android/java/templates/native_foo_header.h", |
| # ] |
| # |
| # package_name = "org/chromium/base/library_loader" |
| # include_path = "android/java/templates" |
| # } |
| template("java_cpp_template") { |
| assert(defined(invoker.sources)) |
| package_name = invoker.package_name + "" |
| |
| if (defined(invoker.include_path)) { |
| include_path = invoker.include_path + "" |
| } else { |
| include_path = "//" |
| } |
| |
| action_foreach("${target_name}__apply_gcc") { |
| script = "//build/android/gyp/gcc_preprocess.py" |
| if (defined(invoker.source_prereqs)) { |
| source_prereqs = invoker.source_prereqs + [] |
| } |
| |
| sources = invoker.sources |
| |
| gen_dir = "${target_gen_dir}/${package_name}" |
| gcc_template_output_pattern = "${gen_dir}/{{source_name_part}}.java" |
| |
| outputs = [ |
| gcc_template_output_pattern |
| ] |
| |
| args = [ |
| "--include-path", rebase_path(include_path, root_build_dir), |
| "--output", rebase_path(gen_dir, root_build_dir) + "/{{source_name_part}}.java", |
| "--template={{source}}", |
| ] |
| } |
| |
| apply_gcc_outputs = get_target_outputs(":${target_name}__apply_gcc") |
| base_gen_dir = get_label_info(":${target_name}__apply_gcc", "target_gen_dir") |
| |
| srcjar_path = "${target_gen_dir}/${target_name}.srcjar" |
| zip("${target_name}__zip_srcjar") { |
| inputs = apply_gcc_outputs |
| output = srcjar_path |
| base_dir = base_gen_dir |
| } |
| |
| group(target_name) { |
| deps = [ |
| ":${target_name}__zip_srcjar" |
| ] |
| } |
| } |