# Copyright 2016 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("//build/config/android/rules.gni")
import("//testing/test.gni")

_registration_header = "$target_gen_dir/sample_jni_registration.h"

generate_jni("jni_sample_header") {
  sources = [
    "java/src/org/chromium/example/jni_generator/SampleForAnnotationProcessor.java",
    "java/src/org/chromium/example/jni_generator/SampleForTests.java",
  ]
  jni_package = "example"
}

android_library("jni_sample_java") {
  java_files = [
    "java/src/org/chromium/example/jni_generator/SampleForTests.java",
    "java/src/org/chromium/example/jni_generator/SampleForAnnotationProcessor.java",
  ]

  deps = [
    "//base:base_java",
    "//base:jni_java",
  ]

  annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
}

android_library("jni_annotation_sample_java") {
  java_files = [ "java/src/org/chromium/example/jni_generator/SampleForAnnotationProcessor.java" ]
  deps = [
    "//base:base_java",
    "//base:jni_java",
  ]
  annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
}

source_set("jni_sample_native_side") {
  deps = [
    ":jni_sample_header",
    "//base",
  ]
  sources = [
    "sample_for_tests.cc",
    "sample_for_tests.h",
  ]
}

shared_library("jni_sample_lib") {
  sources = [
    "sample_entry_point.cc",
    _registration_header,
  ]

  deps = [
    ":jni_sample_native_side",
    ":sample_jni_apk__final_jni",  # For registration_header
    "//base",
  ]
}

android_apk("sample_jni_apk") {
  apk_name = "SampleJni"
  android_manifest = "AndroidManifest.xml"
  deps = [
    ":jni_sample_java",
    "//base:base_java",
    "//base:jni_java",
  ]
  shared_libraries = [ ":jni_sample_lib" ]
  jni_registration_header = _registration_header
}

# Serves to test that generated bindings compile properly.
group("jni_generator_tests") {
  deps = [
    ":jni_annotation_sample_java",
    ":sample_jni_apk",
  ]
}

java_cpp_template("processor_args_java") {
  package_path = "org/chromium/jni_generator"
  sources = [
    "ProcessorArgs.template",
  ]
  defines = [ "IS_JAVA_DEBUG_VALUE=$is_java_debug" ]
}

java_annotation_processor("jni_processor") {
  java_files = [ "java/src/org/chromium/jni_generator/JniProcessor.java" ]

  main_class = "org.chromium.jni_generator.JniProcessor"

  annotation_processor_deps = [ "//third_party/auto:auto_service_processor" ]

  deps = [
    "//base:jni_java",
    "//third_party/android_deps:com_squareup_javapoet_java",
    "//third_party/auto:auto_service_java",
    "//third_party/guava:guava_java",
  ]

  srcjar_deps = [ ":processor_args_java" ]
}
