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

#ifndef org_chromium_TestJni_JNI
#define org_chromium_TestJni_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 kMyOtherInnerClassClassPath[] =
    "org/chromium/TestJni$MyOtherInnerClass";
const char kTestJniClassPath[] = "org/chromium/TestJni";
const char kMyInnerClassClassPath[] = "org/chromium/TestJni$MyInnerClass";
// Leaking this jclass as we cannot use LazyInstance from some threads.
base::subtle::AtomicWord g_MyOtherInnerClass_clazz __attribute__((unused)) = 0;
#define MyOtherInnerClass_clazz(env) base::android::LazyGetClass(env, kMyOtherInnerClassClassPath, &g_MyOtherInnerClass_clazz)
// Leaking this jclass as we cannot use LazyInstance from some threads.
base::subtle::AtomicWord g_TestJni_clazz __attribute__((unused)) = 0;
#define TestJni_clazz(env) base::android::LazyGetClass(env, kTestJniClassPath, &g_TestJni_clazz)
// Leaking this jclass as we cannot use LazyInstance from some threads.
base::subtle::AtomicWord g_MyInnerClass_clazz __attribute__((unused)) = 0;
#define MyInnerClass_clazz(env) base::android::LazyGetClass(env, kMyInnerClassClassPath, &g_MyInnerClass_clazz)

}  // namespace

// Step 2: method stubs.

static jint Init(JNIEnv* env, const base::android::JavaParamRef<jobject>&
    jcaller);

JNI_GENERATOR_EXPORT jint
    Java_org_chromium_TestJni_00024MyInnerClass_nativeInit(JNIEnv* env, jobject
    jcaller) {
  return Init(env, base::android::JavaParamRef<jobject>(env, jcaller));
}

static jint Init(JNIEnv* env, const base::android::JavaParamRef<jobject>&
    jcaller);

JNI_GENERATOR_EXPORT jint
    Java_org_chromium_TestJni_00024MyOtherInnerClass_nativeInit(JNIEnv* env,
    jobject jcaller) {
  return Init(env, base::android::JavaParamRef<jobject>(env, jcaller));
}

// Step 3: RegisterNatives.

static const JNINativeMethod kMethodsMyOtherInnerClass[] = {
    { "nativeInit",
"("
")"
"I",
    reinterpret_cast<void*>(Java_org_chromium_TestJni_00024MyOtherInnerClass_nativeInit)
    },
};

static const JNINativeMethod kMethodsMyInnerClass[] = {
    { "nativeInit",
"("
")"
"I",
    reinterpret_cast<void*>(Java_org_chromium_TestJni_00024MyInnerClass_nativeInit)
    },
};

static bool RegisterNativesImpl(JNIEnv* env) {
  if (jni_generator::ShouldSkipJniRegistration(false))
    return true;

  const int kMethodsMyOtherInnerClassSize =
      arraysize(kMethodsMyOtherInnerClass);

  if (env->RegisterNatives(MyOtherInnerClass_clazz(env),
                           kMethodsMyOtherInnerClass,
                           kMethodsMyOtherInnerClassSize) < 0) {
    jni_generator::HandleRegistrationError(
        env, MyOtherInnerClass_clazz(env), __FILE__);
    return false;
  }

  const int kMethodsMyInnerClassSize = arraysize(kMethodsMyInnerClass);

  if (env->RegisterNatives(MyInnerClass_clazz(env),
                           kMethodsMyInnerClass,
                           kMethodsMyInnerClassSize) < 0) {
    jni_generator::HandleRegistrationError(
        env, MyInnerClass_clazz(env), __FILE__);
    return false;
  }

  return true;
}

#endif  // org_chromium_TestJni_JNI
