Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(963)

Unified Diff: build/config/android/rules.gni

Issue 294323002: Add generate_jar_jni template (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase (+fix specified output file) Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: build/config/android/rules.gni
diff --git a/build/config/android/rules.gni b/build/config/android/rules.gni
index abf64a1c4044cc5e048e92248fa8f778363cbd25..d63c7bf94a5a7c0076bc0a0619ee26e793b2ecea 100644
--- a/build/config/android/rules.gni
+++ b/build/config/android/rules.gni
@@ -2,6 +2,7 @@
# 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
@@ -30,17 +31,13 @@ template("generate_jni") {
base_output_dir = "${root_gen_dir}/${target_name}/${jni_package}"
jni_output_dir = "${base_output_dir}/jni"
- jni_generator_includes =
- rebase_path("//base/android/jni_generator/jni_generator_helper.h")
+ jni_generator_include = "//base/android/jni_generator/jni_generator_helper.h"
- config("jni_includes_${target_name}") {
- include_dirs = [ base_output_dir ]
- }
-
- action_foreach(target_name) {
+ foreach_target_name = "${target_name}__jni_gen"
+ action_foreach(foreach_target_name) {
script = "//base/android/jni_generator/jni_generator.py"
- direct_dependent_configs = [ ":jni_includes_${target_name}" ]
sources = invoker.sources
+ source_prereqs = [ jni_generator_include ]
outputs = [
"${jni_output_dir}/{{source_name_part}}_jni.h"
]
@@ -49,15 +46,117 @@ template("generate_jni") {
"--input_file={{source}}",
"--optimize_generation=1",
"--ptr_type=long",
- "--output_dir", rebase_path(jni_output_dir),
- "--includes=${jni_generator_includes}",
+ "--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)
+ "--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
« no previous file with comments | « build/config/android/config.gni ('k') | ui/gl/BUILD.gn » ('j') | ui/snapshot/BUILD.gn » ('J')

Powered by Google App Engine
This is Rietveld 408576698