// Copyright (c) 2012 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/Test

#ifndef org_chromium_example_jni_generator_Test_JNI
#define org_chromium_example_jni_generator_Test_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 kTestClassPath[] = "org/chromium/example/jni_generator/Test";
// Leaking this jclass as we cannot use LazyInstance from some threads.
jclass g_Test_clazz = NULL;

}  // namespace

// Step 2: method stubs.
static jlong Method(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(arg1);
}

// Step 3: RegisterNatives.

static const JNINativeMethod kMethodsTest[] = {
    { "nativeMethod",
"("
"J"
"I"
")"
"J", reinterpret_cast<void*>(Method) },
};

static bool RegisterNativesImpl(JNIEnv* env) {
  g_Test_clazz = reinterpret_cast<jclass>(env->NewGlobalRef(
      base::android::GetClass(env, kTestClassPath).obj()));

  const int kMethodsTestSize = arraysize(kMethodsTest);

  if (env->RegisterNatives(g_Test_clazz,
                           kMethodsTest,
                           kMethodsTestSize) < 0) {
    jni_generator::HandleRegistrationError(
        env, g_Test_clazz, __FILE__);
    return false;
  }

  return true;
}

#endif  // org_chromium_example_jni_generator_Test_JNI
