// 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.

// This file is autogenerated by
//     base/android/jni_generator/jni_generator.py
// For
//     org/chromium/example/jni_generator/SampleForTests

#ifndef org_chromium_example_jni_generator_SampleForTests_JNI
#define org_chromium_example_jni_generator_SampleForTests_JNI

#include <jni.h>

#include "base/android/jni_generator/jni_generator_helper.h"

#include "base/android/jni_int_wrapper.h"

// Step 1: forward declarations.
namespace {
const char kSampleForTestsClassPath[] =
    "org/chromium/example/jni_generator/SampleForTests";
// Leaking this jclass as we cannot use LazyInstance from some threads.
base::subtle::AtomicWord g_SampleForTests_clazz __attribute__((unused)) = 0;
#define SampleForTests_clazz(env) base::android::LazyGetClass(env, kSampleForTestsClassPath, &g_SampleForTests_clazz)

}  // namespace

extern "C" {

static jint Init(JNIEnv* env, jobject jcaller);

__attribute__((visibility("default")))
jint
    Java_org_chromium_example_jni_1generator_SampleForTests_00024MyInnerClass_nativeInit(JNIEnv*
    env, jobject jcaller) {
  return Init(env, jcaller);
}

static jint Init(JNIEnv* env, jobject jcaller);

__attribute__((visibility("default")))
jint
    Java_org_chromium_example_jni_1generator_SampleForTests_00024MyOtherInnerClass_nativeInit(JNIEnv*
    env, jobject jcaller) {
  return Init(env, jcaller);
}

};  // extern "C"

// Step 2: method stubs.

extern "C" {
__attribute__((visibility("default")))
jint
    Java_org_chromium_example_jni_1generator_SampleForTests_nativeStaticMethod(JNIEnv*
    env,
    jobject jcaller,
    jlong nativeTest,
    jint arg1) {
  Test* native = reinterpret_cast<Test*>(nativeTest);
  CHECK_NATIVE_PTR(env, jcaller, native, "StaticMethod", 0);
  return native->StaticMethod(env, jcaller, arg1);
}

__attribute__((visibility("default")))
jint
    Java_org_chromium_example_jni_1generator_SampleForTests_nativeMethod(JNIEnv*
    env,
    jobject jcaller,
    jlong nativeTest,
    jint arg1) {
  Test* native = reinterpret_cast<Test*>(nativeTest);
  CHECK_NATIVE_PTR(env, jcaller, native, "Method", 0);
  return native->Method(env, jcaller, arg1);
}

static base::subtle::AtomicWord g_SampleForTests_testMethodWithParam = 0;
static void Java_SampleForTests_testMethodWithParam(JNIEnv* env, jobject obj,
    JniIntWrapper iParam) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, obj,
      SampleForTests_clazz(env));
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_INSTANCE>(
      env, SampleForTests_clazz(env),
      "testMethodWithParam",

"("
"I"
")"
"V",
      &g_SampleForTests_testMethodWithParam);

     env->CallVoidMethod(obj,
          method_id, as_jint(iParam));
  jni_generator::CheckException(env);

}

static base::subtle::AtomicWord g_SampleForTests_testMethodWithParamAndReturn =
    0;
static base::android::ScopedJavaLocalRef<jstring>
    Java_SampleForTests_testMethodWithParamAndReturn(JNIEnv* env, jobject obj,
    JniIntWrapper iParam) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, obj,
      SampleForTests_clazz(env), NULL);
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_INSTANCE>(
      env, SampleForTests_clazz(env),
      "testMethodWithParamAndReturn",

"("
"I"
")"
"Ljava/lang/String;",
      &g_SampleForTests_testMethodWithParamAndReturn);

  jstring ret =
      static_cast<jstring>(env->CallObjectMethod(obj,
          method_id, as_jint(iParam)));
  jni_generator::CheckException(env);
  return base::android::ScopedJavaLocalRef<jstring>(env, ret);
}

static base::subtle::AtomicWord g_SampleForTests_testStaticMethodWithParam = 0;
static jint Java_SampleForTests_testStaticMethodWithParam(JNIEnv* env,
    JniIntWrapper iParam) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, SampleForTests_clazz(env),
      SampleForTests_clazz(env), 0);
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_STATIC>(
      env, SampleForTests_clazz(env),
      "testStaticMethodWithParam",

"("
"I"
")"
"I",
      &g_SampleForTests_testStaticMethodWithParam);

  jint ret =
      env->CallStaticIntMethod(SampleForTests_clazz(env),
          method_id, as_jint(iParam));
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_SampleForTests_testMethodWithNoParam = 0;
static jdouble Java_SampleForTests_testMethodWithNoParam(JNIEnv* env) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, SampleForTests_clazz(env),
      SampleForTests_clazz(env), 0);
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_STATIC>(
      env, SampleForTests_clazz(env),
      "testMethodWithNoParam",

"("
")"
"D",
      &g_SampleForTests_testMethodWithNoParam);

  jdouble ret =
      env->CallStaticDoubleMethod(SampleForTests_clazz(env),
          method_id);
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_SampleForTests_testStaticMethodWithNoParam =
    0;
static base::android::ScopedJavaLocalRef<jstring>
    Java_SampleForTests_testStaticMethodWithNoParam(JNIEnv* env) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, SampleForTests_clazz(env),
      SampleForTests_clazz(env), NULL);
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_STATIC>(
      env, SampleForTests_clazz(env),
      "testStaticMethodWithNoParam",

"("
")"
"Ljava/lang/String;",
      &g_SampleForTests_testStaticMethodWithNoParam);

  jstring ret =
static_cast<jstring>(env->CallStaticObjectMethod(SampleForTests_clazz(env),
          method_id));
  jni_generator::CheckException(env);
  return base::android::ScopedJavaLocalRef<jstring>(env, ret);
}
};  // extern "C"

// Step 3: RegisterNatives.

static bool RegisterNativesImpl(JNIEnv* env, jclass clazz) {

  base::subtle::Release_Store(&g_SampleForTests_clazz,
      static_cast<base::subtle::AtomicWord>(env->NewWeakGlobalRef(clazz));

  return true;
}

extern "C" JNIEXPORT bool JNICALL
Java_org_chromium_example_jni_1generator_SampleForTests_nativeInitNativeClass(JNIEnv*
    env, jclass clazz) {
  return RegisterNativesImpl(env, clazz);
}

#endif  // org_chromium_example_jni_generator_SampleForTests_JNI
