| Index: third_party/mojo/src/mojo/public/mojo_application.gni
 | 
| diff --git a/third_party/mojo/src/mojo/public/mojo_application.gni b/third_party/mojo/src/mojo/public/mojo_application.gni
 | 
| index 7ab5a3118e0a639928338f38970a68dce7046632..32bdb7a7d225c7dd457172f0379d69f9eabfaaf7 100644
 | 
| --- a/third_party/mojo/src/mojo/public/mojo_application.gni
 | 
| +++ b/third_party/mojo/src/mojo/public/mojo_application.gni
 | 
| @@ -20,6 +20,7 @@ template("mojo_native_application") {
 | 
|    if (!is_nacl) {
 | 
|      output = base_target_name + ".mojo"
 | 
|      library_target_name = base_target_name + "_library"
 | 
| +    copy_symbols_target = "__${final_target_name}_copy_symbols"
 | 
|  
 | 
|      if (is_linux || is_android) {
 | 
|        library_name = "lib${library_target_name}.so"
 | 
| @@ -130,7 +131,27 @@ template("mojo_native_application") {
 | 
|          testonly = invoker.testonly
 | 
|        }
 | 
|  
 | 
| +      visibility = [
 | 
| +        ":${final_target_name}",
 | 
| +        ":${copy_symbols_target}",
 | 
| +      ]
 | 
| +    }
 | 
| +
 | 
| +    copy(copy_symbols_target) {
 | 
| +      if (defined(invoker.testonly)) {
 | 
| +        testonly = invoker.testonly
 | 
| +      }
 | 
|        visibility = [ ":${final_target_name}" ]
 | 
| +      deps = [
 | 
| +        ":${library_target_name}",
 | 
| +      ]
 | 
| +
 | 
| +      sources = [
 | 
| +        "${root_out_dir}/${library_name}",
 | 
| +      ]
 | 
| +      outputs = [
 | 
| +        "${root_out_dir}/symbols/${library_name}",
 | 
| +      ]
 | 
|      }
 | 
|  
 | 
|      copy(final_target_name) {
 | 
| @@ -142,6 +163,7 @@ template("mojo_native_application") {
 | 
|        }
 | 
|        deps = [
 | 
|          ":${library_target_name}",
 | 
| +        ":${copy_symbols_target}",
 | 
|        ]
 | 
|  
 | 
|        sources = [
 | 
| @@ -289,30 +311,111 @@ template("mojo_native_application") {
 | 
|  }
 | 
|  
 | 
|  if (is_android) {
 | 
| +  import("//build/config/android/rules.gni")
 | 
| +
 | 
|    # Declares an Android Mojo application consisting of an .so file and a
 | 
|    # corresponding .dex.jar file.
 | 
|    #
 | 
|    # Variables:
 | 
| -  #   input_so: the .so file to bundle
 | 
| -  #   input_dex_jar: the .dex.jar file to bundle
 | 
| -  #   deps / public_deps / data_deps (optional):
 | 
| -  #       Dependencies. The targets that generate the .so/jar inputs should be
 | 
| -  #       listed in either deps or public_deps.
 | 
| +  #   sources (optional): The c++ sources.
 | 
| +  #   deps (optional): The c++ dependencies.
 | 
| +  #   java_sources (optional): The java sources.
 | 
| +  #   java_deps (optional): The java dependencies.
 | 
| +  #   jni_package (optional): The c++ package for the generated jni headers.
 | 
|    #   output_name (optional): override for the output file name
 | 
| +  #   public_deps / data_deps (optional): Dependencies.
 | 
|    template("mojo_android_application") {
 | 
| -    assert(defined(invoker.input_so))
 | 
| -    assert(defined(invoker.input_dex_jar))
 | 
| +    shared_library_name = "__${target_name}_lib"
 | 
| +    library_basename = "lib${shared_library_name}.so"
 | 
| +    if (defined(invoker.jni_package)) {
 | 
| +      assert(defined(invoker.java_sources))
 | 
| +      generate_jni_name = "__${target_name}_jni"
 | 
| +    }
 | 
| +    if (defined(invoker.java_sources)) {
 | 
| +      java_library_name = "__${target_name}_java"
 | 
| +    }
 | 
| +    android_standalone_library_name = "__${target_name}_java_lib"
 | 
| +    dex_output_path = "${target_gen_dir}/${target_name}.dex.jar"
 | 
| +    zip_action_name = "__${target_name}_zip"
 | 
| +    zip_action_output = "${target_gen_dir}/${target_name}.zip"
 | 
| +    copy_symbols_target = "__${target_name}_copy_symbols"
 | 
| +    final_target_name = target_name
 | 
| +
 | 
| +    if (defined(invoker.jni_package)) {
 | 
| +      generate_jni(generate_jni_name) {
 | 
| +        visibility = [ ":${shared_library_name}" ]
 | 
| +
 | 
| +        sources = invoker.java_sources
 | 
| +        jni_package = invoker.jni_package
 | 
| +      }
 | 
| +    }
 | 
| +
 | 
| +    shared_library(shared_library_name) {
 | 
| +      visibility = [
 | 
| +        ":${copy_symbols_target}",
 | 
| +        ":${zip_action_name}",
 | 
| +      ]
 | 
| +
 | 
| +      if (defined(invoker.sources)) {
 | 
| +        sources = invoker.sources
 | 
| +      }
 | 
| +
 | 
| +      deps = []
 | 
| +      if (defined(invoker.jni_package)) {
 | 
| +        deps += [ ":${generate_jni_name}" ]
 | 
| +      }
 | 
| +      if (defined(invoker.deps)) {
 | 
| +        deps += invoker.deps
 | 
| +      }
 | 
| +    }
 | 
| +
 | 
| +    copy(copy_symbols_target) {
 | 
| +      visibility = [ ":${final_target_name}" ]
 | 
| +      deps = [
 | 
| +        ":${shared_library_name}",
 | 
| +      ]
 | 
| +
 | 
| +      sources = [
 | 
| +        "${root_out_dir}/${library_basename}",
 | 
| +      ]
 | 
| +      outputs = [
 | 
| +        "${root_out_dir}/symbols/${library_basename}",
 | 
| +      ]
 | 
| +    }
 | 
| +
 | 
| +    if (defined(invoker.java_sources)) {
 | 
| +      android_library(java_library_name) {
 | 
| +        visibility = [ ":*" ]
 | 
| +
 | 
| +        java_files = invoker.java_sources
 | 
| +
 | 
| +        if (defined(invoker.java_deps)) {
 | 
| +          deps = invoker.java_deps
 | 
| +        }
 | 
| +      }
 | 
| +    }
 | 
| +
 | 
| +    android_standalone_library(android_standalone_library_name) {
 | 
| +      deps = []
 | 
| +
 | 
| +      if (defined(invoker.java_sources)) {
 | 
| +        deps += [ ":${java_library_name}" ]
 | 
| +      }
 | 
| +
 | 
| +      if (defined(invoker.java_deps)) {
 | 
| +        deps += invoker.java_deps
 | 
| +      }
 | 
| +
 | 
| +      dex_path = dex_output_path
 | 
| +    }
 | 
|  
 | 
| -    zip_action_name = "${target_name}_zip"
 | 
| -    zip_action_output = "$target_gen_dir/${target_name}.zip"
 | 
| -    prepend_action_name = target_name
 | 
|      action(zip_action_name) {
 | 
| -      visibility = [ ":$prepend_action_name" ]
 | 
| +      visibility = [ ":${final_target_name}" ]
 | 
|        script = "//build/android/gn/zip.py"
 | 
|  
 | 
|        inputs = [
 | 
| -        invoker.input_so,
 | 
| -        invoker.input_dex_jar,
 | 
| +        "${root_out_dir}/lib.stripped/${library_basename}",
 | 
| +        dex_output_path,
 | 
|        ]
 | 
|  
 | 
|        output = zip_action_output
 | 
| @@ -323,8 +426,8 @@ if (is_android) {
 | 
|        rebase_inputs = rebase_path(inputs, root_build_dir)
 | 
|        rebase_output = rebase_path(output, root_build_dir)
 | 
|        args = [
 | 
| -        "--inputs=$rebase_inputs",
 | 
| -        "--output=$rebase_output",
 | 
| +        "--inputs=${rebase_inputs}",
 | 
| +        "--output=${rebase_output}",
 | 
|        ]
 | 
|  
 | 
|        if (defined(invoker.deps)) {
 | 
| @@ -339,12 +442,12 @@ if (is_android) {
 | 
|      }
 | 
|  
 | 
|      if (defined(invoker.output_name)) {
 | 
| -      mojo_output = "$root_out_dir/" + invoker.output_name + ".mojo"
 | 
| +      mojo_output = "${root_out_dir}/" + invoker.output_name + ".mojo"
 | 
|      } else {
 | 
| -      mojo_output = "$root_out_dir/" + target_name + ".mojo"
 | 
| +      mojo_output = "${root_out_dir}/" + target_name + ".mojo"
 | 
|      }
 | 
|  
 | 
| -    action(target_name) {
 | 
| +    action(final_target_name) {
 | 
|        script = rebase_path("mojo/public/tools/prepend.py", ".", mojo_root)
 | 
|  
 | 
|        input = zip_action_output
 | 
| @@ -360,13 +463,17 @@ if (is_android) {
 | 
|        rebase_input = rebase_path(input, root_build_dir)
 | 
|        rebase_output = rebase_path(output, root_build_dir)
 | 
|        args = [
 | 
| -        "--input=$rebase_input",
 | 
| -        "--output=$rebase_output",
 | 
| +        "--input=${rebase_input}",
 | 
| +        "--output=${rebase_output}",
 | 
|          "--line=#!mojo mojo:android_handler",
 | 
|        ]
 | 
|  
 | 
| +      deps = [
 | 
| +        ":${copy_symbols_target}",
 | 
| +      ]
 | 
| +
 | 
|        public_deps = [
 | 
| -        ":$zip_action_name",
 | 
| +        ":${zip_action_name}",
 | 
|        ]
 | 
|      }
 | 
|    }
 | 
| 
 |