// 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.
jclass g_TestJni_clazz = NULL;
#define TestJni_clazz(env) g_TestJni_clazz

}  // namespace

// Step 2: method stubs.

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

static jint Java_org_chromium_TestJni_00024MyInnerClass_nativeInit(JNIEnv* env,
    jobject jcaller) {
  return Init(env, JavaParamRef<jobject>(env, jcaller));
}

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

static jint Java_org_chromium_TestJni_00024MyOtherInnerClass_nativeInit(JNIEnv*
    env, jobject jcaller) {
  return Init(env, 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) {

  g_TestJni_clazz = reinterpret_cast<jclass>(env->NewGlobalRef(
      base::android::GetClass(env, kTestJniClassPath).obj()));

  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
