// 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
//     android/view/MotionEvent

#ifndef android_view_MotionEvent_JNI
#define android_view_MotionEvent_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 kMotionEventClassPath[] = "android/view/MotionEvent";
// Leaking this jclass as we cannot use LazyInstance from some threads.
jclass g_MotionEvent_clazz = NULL;
#define MotionEvent_clazz(env) g_MotionEvent_clazz

}  // namespace

namespace JNI_MotionEvent {

enum Java_MotionEvent_constant_fields {
  INVALID_POINTER_ID = -1,
  ACTION_MASK = 255,
  ACTION_DOWN = 0,
  ACTION_UP = 1,
  ACTION_MOVE = 2,
  ACTION_CANCEL = 3,
  ACTION_OUTSIDE = 4,
  ACTION_POINTER_DOWN = 5,
  ACTION_POINTER_UP = 6,
  ACTION_HOVER_MOVE = 7,
  ACTION_SCROLL = 8,
  ACTION_HOVER_ENTER = 9,
  ACTION_HOVER_EXIT = 10,
  ACTION_POINTER_INDEX_MASK = 65280,
  ACTION_POINTER_INDEX_SHIFT = 8,
  ACTION_POINTER_1_DOWN = 5,
  ACTION_POINTER_2_DOWN = 261,
  ACTION_POINTER_3_DOWN = 517,
  ACTION_POINTER_1_UP = 6,
  ACTION_POINTER_2_UP = 262,
  ACTION_POINTER_3_UP = 518,
  ACTION_POINTER_ID_MASK = 65280,
  ACTION_POINTER_ID_SHIFT = 8,
  FLAG_WINDOW_IS_OBSCURED = 1,
  EDGE_TOP = 1,
  EDGE_BOTTOM = 2,
  EDGE_LEFT = 4,
  EDGE_RIGHT = 8,
  AXIS_X = 0,
  AXIS_Y = 1,
  AXIS_PRESSURE = 2,
  AXIS_SIZE = 3,
  AXIS_TOUCH_MAJOR = 4,
  AXIS_TOUCH_MINOR = 5,
  AXIS_TOOL_MAJOR = 6,
  AXIS_TOOL_MINOR = 7,
  AXIS_ORIENTATION = 8,
  AXIS_VSCROLL = 9,
  AXIS_HSCROLL = 10,
  AXIS_Z = 11,
  AXIS_RX = 12,
  AXIS_RY = 13,
  AXIS_RZ = 14,
  AXIS_HAT_X = 15,
  AXIS_HAT_Y = 16,
  AXIS_LTRIGGER = 17,
  AXIS_RTRIGGER = 18,
  AXIS_THROTTLE = 19,
  AXIS_RUDDER = 20,
  AXIS_WHEEL = 21,
  AXIS_GAS = 22,
  AXIS_BRAKE = 23,
  AXIS_DISTANCE = 24,
  AXIS_TILT = 25,
  AXIS_GENERIC_1 = 32,
  AXIS_GENERIC_2 = 33,
  AXIS_GENERIC_3 = 34,
  AXIS_GENERIC_4 = 35,
  AXIS_GENERIC_5 = 36,
  AXIS_GENERIC_6 = 37,
  AXIS_GENERIC_7 = 38,
  AXIS_GENERIC_8 = 39,
  AXIS_GENERIC_9 = 40,
  AXIS_GENERIC_10 = 41,
  AXIS_GENERIC_11 = 42,
  AXIS_GENERIC_12 = 43,
  AXIS_GENERIC_13 = 44,
  AXIS_GENERIC_14 = 45,
  AXIS_GENERIC_15 = 46,
  AXIS_GENERIC_16 = 47,
  BUTTON_PRIMARY = 1,
  BUTTON_SECONDARY = 2,
  BUTTON_TERTIARY = 4,
  BUTTON_BACK = 8,
  BUTTON_FORWARD = 16,
  TOOL_TYPE_UNKNOWN = 0,
  TOOL_TYPE_FINGER = 1,
  TOOL_TYPE_STYLUS = 2,
  TOOL_TYPE_MOUSE = 3,
  TOOL_TYPE_ERASER = 4,
};

// Step 2: method stubs.

static base::subtle::AtomicWord g_MotionEvent_finalize = 0;
static void Java_MotionEvent_finalize(JNIEnv* env, jobject obj) __attribute__
    ((unused));
static void Java_MotionEvent_finalize(JNIEnv* env, jobject obj) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, obj,
      MotionEvent_clazz(env));
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_INSTANCE>(
      env, MotionEvent_clazz(env),
      "finalize",
      "()V",
      &g_MotionEvent_finalize);

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

}

static base::subtle::AtomicWord
    g_MotionEvent_obtainAVME_J_J_I_I_LAVMEPP_LAVMEPC_I_I_F_F_I_I_I_I = 0;
static ScopedJavaLocalRef<jobject>
    Java_MotionEvent_obtainAVME_J_J_I_I_LAVMEPP_LAVMEPC_I_I_F_F_I_I_I_I(JNIEnv*
    env, jlong p0,
    jlong p1,
    JniIntWrapper p2,
    JniIntWrapper p3,
    jobjectArray p4,
    jobjectArray p5,
    JniIntWrapper p6,
    JniIntWrapper p7,
    jfloat p8,
    jfloat p9,
    JniIntWrapper p10,
    JniIntWrapper p11,
    JniIntWrapper p12,
    JniIntWrapper p13) __attribute__ ((unused));
static ScopedJavaLocalRef<jobject>
    Java_MotionEvent_obtainAVME_J_J_I_I_LAVMEPP_LAVMEPC_I_I_F_F_I_I_I_I(JNIEnv*
    env, jlong p0,
    jlong p1,
    JniIntWrapper p2,
    JniIntWrapper p3,
    jobjectArray p4,
    jobjectArray p5,
    JniIntWrapper p6,
    JniIntWrapper p7,
    jfloat p8,
    jfloat p9,
    JniIntWrapper p10,
    JniIntWrapper p11,
    JniIntWrapper p12,
    JniIntWrapper p13) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, MotionEvent_clazz(env),
      MotionEvent_clazz(env), NULL);
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_STATIC>(
      env, MotionEvent_clazz(env),
      "obtain",
"(JJII[Landroid/view/MotionEvent$PointerProperties;[Landroid/view/MotionEvent$PointerCoords;IIFFIIII)Landroid/view/MotionEvent;",
      &g_MotionEvent_obtainAVME_J_J_I_I_LAVMEPP_LAVMEPC_I_I_F_F_I_I_I_I);

  jobject ret =
      env->CallStaticObjectMethod(MotionEvent_clazz(env),
          method_id, p0, p1, as_jint(p2), as_jint(p3), p4, p5, as_jint(p6),
              as_jint(p7), p8, p9, as_jint(p10), as_jint(p11), as_jint(p12),
              as_jint(p13));
  jni_generator::CheckException(env);
  return ScopedJavaLocalRef<jobject>(env, ret);
}

static base::subtle::AtomicWord
    g_MotionEvent_obtainAVME_J_J_I_I_AI_LAVMEPC_I_F_F_I_I_I_I = 0;
static ScopedJavaLocalRef<jobject>
    Java_MotionEvent_obtainAVME_J_J_I_I_AI_LAVMEPC_I_F_F_I_I_I_I(JNIEnv* env,
    jlong p0,
    jlong p1,
    JniIntWrapper p2,
    JniIntWrapper p3,
    jintArray p4,
    jobjectArray p5,
    JniIntWrapper p6,
    jfloat p7,
    jfloat p8,
    JniIntWrapper p9,
    JniIntWrapper p10,
    JniIntWrapper p11,
    JniIntWrapper p12) __attribute__ ((unused));
static ScopedJavaLocalRef<jobject>
    Java_MotionEvent_obtainAVME_J_J_I_I_AI_LAVMEPC_I_F_F_I_I_I_I(JNIEnv* env,
    jlong p0,
    jlong p1,
    JniIntWrapper p2,
    JniIntWrapper p3,
    jintArray p4,
    jobjectArray p5,
    JniIntWrapper p6,
    jfloat p7,
    jfloat p8,
    JniIntWrapper p9,
    JniIntWrapper p10,
    JniIntWrapper p11,
    JniIntWrapper p12) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, MotionEvent_clazz(env),
      MotionEvent_clazz(env), NULL);
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_STATIC>(
      env, MotionEvent_clazz(env),
      "obtain",
"(JJII[I[Landroid/view/MotionEvent$PointerCoords;IFFIIII)Landroid/view/MotionEvent;",
      &g_MotionEvent_obtainAVME_J_J_I_I_AI_LAVMEPC_I_F_F_I_I_I_I);

  jobject ret =
      env->CallStaticObjectMethod(MotionEvent_clazz(env),
          method_id, p0, p1, as_jint(p2), as_jint(p3), p4, p5, as_jint(p6), p7,
              p8, as_jint(p9), as_jint(p10), as_jint(p11), as_jint(p12));
  jni_generator::CheckException(env);
  return ScopedJavaLocalRef<jobject>(env, ret);
}

static base::subtle::AtomicWord g_MotionEvent_obtainAVME_J_J_I_F_F_F_F_I_F_F_I_I
    = 0;
static ScopedJavaLocalRef<jobject>
    Java_MotionEvent_obtainAVME_J_J_I_F_F_F_F_I_F_F_I_I(JNIEnv* env, jlong p0,
    jlong p1,
    JniIntWrapper p2,
    jfloat p3,
    jfloat p4,
    jfloat p5,
    jfloat p6,
    JniIntWrapper p7,
    jfloat p8,
    jfloat p9,
    JniIntWrapper p10,
    JniIntWrapper p11) __attribute__ ((unused));
static ScopedJavaLocalRef<jobject>
    Java_MotionEvent_obtainAVME_J_J_I_F_F_F_F_I_F_F_I_I(JNIEnv* env, jlong p0,
    jlong p1,
    JniIntWrapper p2,
    jfloat p3,
    jfloat p4,
    jfloat p5,
    jfloat p6,
    JniIntWrapper p7,
    jfloat p8,
    jfloat p9,
    JniIntWrapper p10,
    JniIntWrapper p11) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, MotionEvent_clazz(env),
      MotionEvent_clazz(env), NULL);
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_STATIC>(
      env, MotionEvent_clazz(env),
      "obtain",
      "(JJIFFFFIFFII)Landroid/view/MotionEvent;",
      &g_MotionEvent_obtainAVME_J_J_I_F_F_F_F_I_F_F_I_I);

  jobject ret =
      env->CallStaticObjectMethod(MotionEvent_clazz(env),
          method_id, p0, p1, as_jint(p2), p3, p4, p5, p6, as_jint(p7), p8, p9,
              as_jint(p10), as_jint(p11));
  jni_generator::CheckException(env);
  return ScopedJavaLocalRef<jobject>(env, ret);
}

static base::subtle::AtomicWord
    g_MotionEvent_obtainAVME_J_J_I_I_F_F_F_F_I_F_F_I_I = 0;
static ScopedJavaLocalRef<jobject>
    Java_MotionEvent_obtainAVME_J_J_I_I_F_F_F_F_I_F_F_I_I(JNIEnv* env, jlong p0,
    jlong p1,
    JniIntWrapper p2,
    JniIntWrapper p3,
    jfloat p4,
    jfloat p5,
    jfloat p6,
    jfloat p7,
    JniIntWrapper p8,
    jfloat p9,
    jfloat p10,
    JniIntWrapper p11,
    JniIntWrapper p12) __attribute__ ((unused));
static ScopedJavaLocalRef<jobject>
    Java_MotionEvent_obtainAVME_J_J_I_I_F_F_F_F_I_F_F_I_I(JNIEnv* env, jlong p0,
    jlong p1,
    JniIntWrapper p2,
    JniIntWrapper p3,
    jfloat p4,
    jfloat p5,
    jfloat p6,
    jfloat p7,
    JniIntWrapper p8,
    jfloat p9,
    jfloat p10,
    JniIntWrapper p11,
    JniIntWrapper p12) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, MotionEvent_clazz(env),
      MotionEvent_clazz(env), NULL);
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_STATIC>(
      env, MotionEvent_clazz(env),
      "obtain",
      "(JJIIFFFFIFFII)Landroid/view/MotionEvent;",
      &g_MotionEvent_obtainAVME_J_J_I_I_F_F_F_F_I_F_F_I_I);

  jobject ret =
      env->CallStaticObjectMethod(MotionEvent_clazz(env),
          method_id, p0, p1, as_jint(p2), as_jint(p3), p4, p5, p6, p7,
              as_jint(p8), p9, p10, as_jint(p11), as_jint(p12));
  jni_generator::CheckException(env);
  return ScopedJavaLocalRef<jobject>(env, ret);
}

static base::subtle::AtomicWord g_MotionEvent_obtainAVME_J_J_I_F_F_I = 0;
static ScopedJavaLocalRef<jobject>
    Java_MotionEvent_obtainAVME_J_J_I_F_F_I(JNIEnv* env, jlong p0,
    jlong p1,
    JniIntWrapper p2,
    jfloat p3,
    jfloat p4,
    JniIntWrapper p5) __attribute__ ((unused));
static ScopedJavaLocalRef<jobject>
    Java_MotionEvent_obtainAVME_J_J_I_F_F_I(JNIEnv* env, jlong p0,
    jlong p1,
    JniIntWrapper p2,
    jfloat p3,
    jfloat p4,
    JniIntWrapper p5) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, MotionEvent_clazz(env),
      MotionEvent_clazz(env), NULL);
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_STATIC>(
      env, MotionEvent_clazz(env),
      "obtain",
      "(JJIFFI)Landroid/view/MotionEvent;",
      &g_MotionEvent_obtainAVME_J_J_I_F_F_I);

  jobject ret =
      env->CallStaticObjectMethod(MotionEvent_clazz(env),
          method_id, p0, p1, as_jint(p2), p3, p4, as_jint(p5));
  jni_generator::CheckException(env);
  return ScopedJavaLocalRef<jobject>(env, ret);
}

static base::subtle::AtomicWord g_MotionEvent_obtainAVME_AVME = 0;
static ScopedJavaLocalRef<jobject> Java_MotionEvent_obtainAVME_AVME(JNIEnv* env,
    jobject p0) __attribute__ ((unused));
static ScopedJavaLocalRef<jobject> Java_MotionEvent_obtainAVME_AVME(JNIEnv* env,
    jobject p0) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, MotionEvent_clazz(env),
      MotionEvent_clazz(env), NULL);
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_STATIC>(
      env, MotionEvent_clazz(env),
      "obtain",
      "(Landroid/view/MotionEvent;)Landroid/view/MotionEvent;",
      &g_MotionEvent_obtainAVME_AVME);

  jobject ret =
      env->CallStaticObjectMethod(MotionEvent_clazz(env),
          method_id, p0);
  jni_generator::CheckException(env);
  return ScopedJavaLocalRef<jobject>(env, ret);
}

static base::subtle::AtomicWord g_MotionEvent_obtainNoHistory = 0;
static ScopedJavaLocalRef<jobject> Java_MotionEvent_obtainNoHistory(JNIEnv* env,
    jobject p0) __attribute__ ((unused));
static ScopedJavaLocalRef<jobject> Java_MotionEvent_obtainNoHistory(JNIEnv* env,
    jobject p0) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, MotionEvent_clazz(env),
      MotionEvent_clazz(env), NULL);
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_STATIC>(
      env, MotionEvent_clazz(env),
      "obtainNoHistory",
      "(Landroid/view/MotionEvent;)Landroid/view/MotionEvent;",
      &g_MotionEvent_obtainNoHistory);

  jobject ret =
      env->CallStaticObjectMethod(MotionEvent_clazz(env),
          method_id, p0);
  jni_generator::CheckException(env);
  return ScopedJavaLocalRef<jobject>(env, ret);
}

static base::subtle::AtomicWord g_MotionEvent_recycle = 0;
static void Java_MotionEvent_recycle(JNIEnv* env, jobject obj) __attribute__
    ((unused));
static void Java_MotionEvent_recycle(JNIEnv* env, jobject obj) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, obj,
      MotionEvent_clazz(env));
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_INSTANCE>(
      env, MotionEvent_clazz(env),
      "recycle",
      "()V",
      &g_MotionEvent_recycle);

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

}

static base::subtle::AtomicWord g_MotionEvent_getDeviceId = 0;
static jint Java_MotionEvent_getDeviceId(JNIEnv* env, jobject obj) __attribute__
    ((unused));
static jint Java_MotionEvent_getDeviceId(JNIEnv* env, jobject obj) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, obj,
      MotionEvent_clazz(env), 0);
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_INSTANCE>(
      env, MotionEvent_clazz(env),
      "getDeviceId",
      "()I",
      &g_MotionEvent_getDeviceId);

  jint ret =
      env->CallIntMethod(obj,
          method_id);
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getSource = 0;
static jint Java_MotionEvent_getSource(JNIEnv* env, jobject obj) __attribute__
    ((unused));
static jint Java_MotionEvent_getSource(JNIEnv* env, jobject obj) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, obj,
      MotionEvent_clazz(env), 0);
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_INSTANCE>(
      env, MotionEvent_clazz(env),
      "getSource",
      "()I",
      &g_MotionEvent_getSource);

  jint ret =
      env->CallIntMethod(obj,
          method_id);
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_setSource = 0;
static void Java_MotionEvent_setSource(JNIEnv* env, jobject obj, JniIntWrapper
    p0) __attribute__ ((unused));
static void Java_MotionEvent_setSource(JNIEnv* env, jobject obj, JniIntWrapper
    p0) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, obj,
      MotionEvent_clazz(env));
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_INSTANCE>(
      env, MotionEvent_clazz(env),
      "setSource",
      "(I)V",
      &g_MotionEvent_setSource);

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

}

static base::subtle::AtomicWord g_MotionEvent_getAction = 0;
static jint Java_MotionEvent_getAction(JNIEnv* env, jobject obj) __attribute__
    ((unused));
static jint Java_MotionEvent_getAction(JNIEnv* env, jobject obj) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, obj,
      MotionEvent_clazz(env), 0);
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_INSTANCE>(
      env, MotionEvent_clazz(env),
      "getAction",
      "()I",
      &g_MotionEvent_getAction);

  jint ret =
      env->CallIntMethod(obj,
          method_id);
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getActionMasked = 0;
static jint Java_MotionEvent_getActionMasked(JNIEnv* env, jobject obj)
    __attribute__ ((unused));
static jint Java_MotionEvent_getActionMasked(JNIEnv* env, jobject obj) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, obj,
      MotionEvent_clazz(env), 0);
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_INSTANCE>(
      env, MotionEvent_clazz(env),
      "getActionMasked",
      "()I",
      &g_MotionEvent_getActionMasked);

  jint ret =
      env->CallIntMethod(obj,
          method_id);
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getActionIndex = 0;
static jint Java_MotionEvent_getActionIndex(JNIEnv* env, jobject obj)
    __attribute__ ((unused));
static jint Java_MotionEvent_getActionIndex(JNIEnv* env, jobject obj) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, obj,
      MotionEvent_clazz(env), 0);
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_INSTANCE>(
      env, MotionEvent_clazz(env),
      "getActionIndex",
      "()I",
      &g_MotionEvent_getActionIndex);

  jint ret =
      env->CallIntMethod(obj,
          method_id);
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getFlags = 0;
static jint Java_MotionEvent_getFlags(JNIEnv* env, jobject obj) __attribute__
    ((unused));
static jint Java_MotionEvent_getFlags(JNIEnv* env, jobject obj) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, obj,
      MotionEvent_clazz(env), 0);
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_INSTANCE>(
      env, MotionEvent_clazz(env),
      "getFlags",
      "()I",
      &g_MotionEvent_getFlags);

  jint ret =
      env->CallIntMethod(obj,
          method_id);
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getDownTime = 0;
static jlong Java_MotionEvent_getDownTime(JNIEnv* env, jobject obj)
    __attribute__ ((unused));
static jlong Java_MotionEvent_getDownTime(JNIEnv* env, jobject obj) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, obj,
      MotionEvent_clazz(env), 0);
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_INSTANCE>(
      env, MotionEvent_clazz(env),
      "getDownTime",
      "()J",
      &g_MotionEvent_getDownTime);

  jlong ret =
      env->CallLongMethod(obj,
          method_id);
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getEventTime = 0;
static jlong Java_MotionEvent_getEventTime(JNIEnv* env, jobject obj)
    __attribute__ ((unused));
static jlong Java_MotionEvent_getEventTime(JNIEnv* env, jobject obj) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, obj,
      MotionEvent_clazz(env), 0);
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_INSTANCE>(
      env, MotionEvent_clazz(env),
      "getEventTime",
      "()J",
      &g_MotionEvent_getEventTime);

  jlong ret =
      env->CallLongMethod(obj,
          method_id);
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getXF = 0;
static jfloat Java_MotionEvent_getXF(JNIEnv* env, jobject obj) __attribute__
    ((unused));
static jfloat Java_MotionEvent_getXF(JNIEnv* env, jobject obj) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, obj,
      MotionEvent_clazz(env), 0);
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_INSTANCE>(
      env, MotionEvent_clazz(env),
      "getX",
      "()F",
      &g_MotionEvent_getXF);

  jfloat ret =
      env->CallFloatMethod(obj,
          method_id);
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getYF = 0;
static jfloat Java_MotionEvent_getYF(JNIEnv* env, jobject obj) __attribute__
    ((unused));
static jfloat Java_MotionEvent_getYF(JNIEnv* env, jobject obj) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, obj,
      MotionEvent_clazz(env), 0);
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_INSTANCE>(
      env, MotionEvent_clazz(env),
      "getY",
      "()F",
      &g_MotionEvent_getYF);

  jfloat ret =
      env->CallFloatMethod(obj,
          method_id);
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getPressureF = 0;
static jfloat Java_MotionEvent_getPressureF(JNIEnv* env, jobject obj)
    __attribute__ ((unused));
static jfloat Java_MotionEvent_getPressureF(JNIEnv* env, jobject obj) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, obj,
      MotionEvent_clazz(env), 0);
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_INSTANCE>(
      env, MotionEvent_clazz(env),
      "getPressure",
      "()F",
      &g_MotionEvent_getPressureF);

  jfloat ret =
      env->CallFloatMethod(obj,
          method_id);
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getSizeF = 0;
static jfloat Java_MotionEvent_getSizeF(JNIEnv* env, jobject obj) __attribute__
    ((unused));
static jfloat Java_MotionEvent_getSizeF(JNIEnv* env, jobject obj) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, obj,
      MotionEvent_clazz(env), 0);
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_INSTANCE>(
      env, MotionEvent_clazz(env),
      "getSize",
      "()F",
      &g_MotionEvent_getSizeF);

  jfloat ret =
      env->CallFloatMethod(obj,
          method_id);
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getTouchMajorF = 0;
static jfloat Java_MotionEvent_getTouchMajorF(JNIEnv* env, jobject obj)
    __attribute__ ((unused));
static jfloat Java_MotionEvent_getTouchMajorF(JNIEnv* env, jobject obj) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, obj,
      MotionEvent_clazz(env), 0);
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_INSTANCE>(
      env, MotionEvent_clazz(env),
      "getTouchMajor",
      "()F",
      &g_MotionEvent_getTouchMajorF);

  jfloat ret =
      env->CallFloatMethod(obj,
          method_id);
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getTouchMinorF = 0;
static jfloat Java_MotionEvent_getTouchMinorF(JNIEnv* env, jobject obj)
    __attribute__ ((unused));
static jfloat Java_MotionEvent_getTouchMinorF(JNIEnv* env, jobject obj) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, obj,
      MotionEvent_clazz(env), 0);
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_INSTANCE>(
      env, MotionEvent_clazz(env),
      "getTouchMinor",
      "()F",
      &g_MotionEvent_getTouchMinorF);

  jfloat ret =
      env->CallFloatMethod(obj,
          method_id);
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getToolMajorF = 0;
static jfloat Java_MotionEvent_getToolMajorF(JNIEnv* env, jobject obj)
    __attribute__ ((unused));
static jfloat Java_MotionEvent_getToolMajorF(JNIEnv* env, jobject obj) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, obj,
      MotionEvent_clazz(env), 0);
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_INSTANCE>(
      env, MotionEvent_clazz(env),
      "getToolMajor",
      "()F",
      &g_MotionEvent_getToolMajorF);

  jfloat ret =
      env->CallFloatMethod(obj,
          method_id);
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getToolMinorF = 0;
static jfloat Java_MotionEvent_getToolMinorF(JNIEnv* env, jobject obj)
    __attribute__ ((unused));
static jfloat Java_MotionEvent_getToolMinorF(JNIEnv* env, jobject obj) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, obj,
      MotionEvent_clazz(env), 0);
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_INSTANCE>(
      env, MotionEvent_clazz(env),
      "getToolMinor",
      "()F",
      &g_MotionEvent_getToolMinorF);

  jfloat ret =
      env->CallFloatMethod(obj,
          method_id);
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getOrientationF = 0;
static jfloat Java_MotionEvent_getOrientationF(JNIEnv* env, jobject obj)
    __attribute__ ((unused));
static jfloat Java_MotionEvent_getOrientationF(JNIEnv* env, jobject obj) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, obj,
      MotionEvent_clazz(env), 0);
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_INSTANCE>(
      env, MotionEvent_clazz(env),
      "getOrientation",
      "()F",
      &g_MotionEvent_getOrientationF);

  jfloat ret =
      env->CallFloatMethod(obj,
          method_id);
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getAxisValueF_I = 0;
static jfloat Java_MotionEvent_getAxisValueF_I(JNIEnv* env, jobject obj,
    JniIntWrapper p0) __attribute__ ((unused));
static jfloat Java_MotionEvent_getAxisValueF_I(JNIEnv* env, jobject obj,
    JniIntWrapper p0) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, obj,
      MotionEvent_clazz(env), 0);
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_INSTANCE>(
      env, MotionEvent_clazz(env),
      "getAxisValue",
      "(I)F",
      &g_MotionEvent_getAxisValueF_I);

  jfloat ret =
      env->CallFloatMethod(obj,
          method_id, as_jint(p0));
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getPointerCount = 0;
static jint Java_MotionEvent_getPointerCount(JNIEnv* env, jobject obj)
    __attribute__ ((unused));
static jint Java_MotionEvent_getPointerCount(JNIEnv* env, jobject obj) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, obj,
      MotionEvent_clazz(env), 0);
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_INSTANCE>(
      env, MotionEvent_clazz(env),
      "getPointerCount",
      "()I",
      &g_MotionEvent_getPointerCount);

  jint ret =
      env->CallIntMethod(obj,
          method_id);
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getPointerId = 0;
static jint Java_MotionEvent_getPointerId(JNIEnv* env, jobject obj,
    JniIntWrapper p0) __attribute__ ((unused));
static jint Java_MotionEvent_getPointerId(JNIEnv* env, jobject obj,
    JniIntWrapper p0) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, obj,
      MotionEvent_clazz(env), 0);
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_INSTANCE>(
      env, MotionEvent_clazz(env),
      "getPointerId",
      "(I)I",
      &g_MotionEvent_getPointerId);

  jint ret =
      env->CallIntMethod(obj,
          method_id, as_jint(p0));
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getToolType = 0;
static jint Java_MotionEvent_getToolType(JNIEnv* env, jobject obj, JniIntWrapper
    p0) __attribute__ ((unused));
static jint Java_MotionEvent_getToolType(JNIEnv* env, jobject obj, JniIntWrapper
    p0) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, obj,
      MotionEvent_clazz(env), 0);
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_INSTANCE>(
      env, MotionEvent_clazz(env),
      "getToolType",
      "(I)I",
      &g_MotionEvent_getToolType);

  jint ret =
      env->CallIntMethod(obj,
          method_id, as_jint(p0));
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_findPointerIndex = 0;
static jint Java_MotionEvent_findPointerIndex(JNIEnv* env, jobject obj,
    JniIntWrapper p0) __attribute__ ((unused));
static jint Java_MotionEvent_findPointerIndex(JNIEnv* env, jobject obj,
    JniIntWrapper p0) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, obj,
      MotionEvent_clazz(env), 0);
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_INSTANCE>(
      env, MotionEvent_clazz(env),
      "findPointerIndex",
      "(I)I",
      &g_MotionEvent_findPointerIndex);

  jint ret =
      env->CallIntMethod(obj,
          method_id, as_jint(p0));
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getXF_I = 0;
static jfloat Java_MotionEvent_getXF_I(JNIEnv* env, jobject obj, JniIntWrapper
    p0) __attribute__ ((unused));
static jfloat Java_MotionEvent_getXF_I(JNIEnv* env, jobject obj, JniIntWrapper
    p0) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, obj,
      MotionEvent_clazz(env), 0);
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_INSTANCE>(
      env, MotionEvent_clazz(env),
      "getX",
      "(I)F",
      &g_MotionEvent_getXF_I);

  jfloat ret =
      env->CallFloatMethod(obj,
          method_id, as_jint(p0));
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getYF_I = 0;
static jfloat Java_MotionEvent_getYF_I(JNIEnv* env, jobject obj, JniIntWrapper
    p0) __attribute__ ((unused));
static jfloat Java_MotionEvent_getYF_I(JNIEnv* env, jobject obj, JniIntWrapper
    p0) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, obj,
      MotionEvent_clazz(env), 0);
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_INSTANCE>(
      env, MotionEvent_clazz(env),
      "getY",
      "(I)F",
      &g_MotionEvent_getYF_I);

  jfloat ret =
      env->CallFloatMethod(obj,
          method_id, as_jint(p0));
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getPressureF_I = 0;
static jfloat Java_MotionEvent_getPressureF_I(JNIEnv* env, jobject obj,
    JniIntWrapper p0) __attribute__ ((unused));
static jfloat Java_MotionEvent_getPressureF_I(JNIEnv* env, jobject obj,
    JniIntWrapper p0) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, obj,
      MotionEvent_clazz(env), 0);
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_INSTANCE>(
      env, MotionEvent_clazz(env),
      "getPressure",
      "(I)F",
      &g_MotionEvent_getPressureF_I);

  jfloat ret =
      env->CallFloatMethod(obj,
          method_id, as_jint(p0));
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getSizeF_I = 0;
static jfloat Java_MotionEvent_getSizeF_I(JNIEnv* env, jobject obj,
    JniIntWrapper p0) __attribute__ ((unused));
static jfloat Java_MotionEvent_getSizeF_I(JNIEnv* env, jobject obj,
    JniIntWrapper p0) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, obj,
      MotionEvent_clazz(env), 0);
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_INSTANCE>(
      env, MotionEvent_clazz(env),
      "getSize",
      "(I)F",
      &g_MotionEvent_getSizeF_I);

  jfloat ret =
      env->CallFloatMethod(obj,
          method_id, as_jint(p0));
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getTouchMajorF_I = 0;
static jfloat Java_MotionEvent_getTouchMajorF_I(JNIEnv* env, jobject obj,
    JniIntWrapper p0) __attribute__ ((unused));
static jfloat Java_MotionEvent_getTouchMajorF_I(JNIEnv* env, jobject obj,
    JniIntWrapper p0) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, obj,
      MotionEvent_clazz(env), 0);
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_INSTANCE>(
      env, MotionEvent_clazz(env),
      "getTouchMajor",
      "(I)F",
      &g_MotionEvent_getTouchMajorF_I);

  jfloat ret =
      env->CallFloatMethod(obj,
          method_id, as_jint(p0));
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getTouchMinorF_I = 0;
static jfloat Java_MotionEvent_getTouchMinorF_I(JNIEnv* env, jobject obj,
    JniIntWrapper p0) __attribute__ ((unused));
static jfloat Java_MotionEvent_getTouchMinorF_I(JNIEnv* env, jobject obj,
    JniIntWrapper p0) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, obj,
      MotionEvent_clazz(env), 0);
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_INSTANCE>(
      env, MotionEvent_clazz(env),
      "getTouchMinor",
      "(I)F",
      &g_MotionEvent_getTouchMinorF_I);

  jfloat ret =
      env->CallFloatMethod(obj,
          method_id, as_jint(p0));
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getToolMajorF_I = 0;
static jfloat Java_MotionEvent_getToolMajorF_I(JNIEnv* env, jobject obj,
    JniIntWrapper p0) __attribute__ ((unused));
static jfloat Java_MotionEvent_getToolMajorF_I(JNIEnv* env, jobject obj,
    JniIntWrapper p0) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, obj,
      MotionEvent_clazz(env), 0);
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_INSTANCE>(
      env, MotionEvent_clazz(env),
      "getToolMajor",
      "(I)F",
      &g_MotionEvent_getToolMajorF_I);

  jfloat ret =
      env->CallFloatMethod(obj,
          method_id, as_jint(p0));
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getToolMinorF_I = 0;
static jfloat Java_MotionEvent_getToolMinorF_I(JNIEnv* env, jobject obj,
    JniIntWrapper p0) __attribute__ ((unused));
static jfloat Java_MotionEvent_getToolMinorF_I(JNIEnv* env, jobject obj,
    JniIntWrapper p0) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, obj,
      MotionEvent_clazz(env), 0);
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_INSTANCE>(
      env, MotionEvent_clazz(env),
      "getToolMinor",
      "(I)F",
      &g_MotionEvent_getToolMinorF_I);

  jfloat ret =
      env->CallFloatMethod(obj,
          method_id, as_jint(p0));
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getOrientationF_I = 0;
static jfloat Java_MotionEvent_getOrientationF_I(JNIEnv* env, jobject obj,
    JniIntWrapper p0) __attribute__ ((unused));
static jfloat Java_MotionEvent_getOrientationF_I(JNIEnv* env, jobject obj,
    JniIntWrapper p0) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, obj,
      MotionEvent_clazz(env), 0);
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_INSTANCE>(
      env, MotionEvent_clazz(env),
      "getOrientation",
      "(I)F",
      &g_MotionEvent_getOrientationF_I);

  jfloat ret =
      env->CallFloatMethod(obj,
          method_id, as_jint(p0));
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getAxisValueF_I_I = 0;
static jfloat Java_MotionEvent_getAxisValueF_I_I(JNIEnv* env, jobject obj,
    JniIntWrapper p0,
    JniIntWrapper p1) __attribute__ ((unused));
static jfloat Java_MotionEvent_getAxisValueF_I_I(JNIEnv* env, jobject obj,
    JniIntWrapper p0,
    JniIntWrapper p1) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, obj,
      MotionEvent_clazz(env), 0);
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_INSTANCE>(
      env, MotionEvent_clazz(env),
      "getAxisValue",
      "(II)F",
      &g_MotionEvent_getAxisValueF_I_I);

  jfloat ret =
      env->CallFloatMethod(obj,
          method_id, as_jint(p0), as_jint(p1));
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getPointerCoords = 0;
static void Java_MotionEvent_getPointerCoords(JNIEnv* env, jobject obj,
    JniIntWrapper p0,
    jobject p1) __attribute__ ((unused));
static void Java_MotionEvent_getPointerCoords(JNIEnv* env, jobject obj,
    JniIntWrapper p0,
    jobject p1) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, obj,
      MotionEvent_clazz(env));
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_INSTANCE>(
      env, MotionEvent_clazz(env),
      "getPointerCoords",
      "(ILandroid/view/MotionEvent$PointerCoords;)V",
      &g_MotionEvent_getPointerCoords);

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

}

static base::subtle::AtomicWord g_MotionEvent_getPointerProperties = 0;
static void Java_MotionEvent_getPointerProperties(JNIEnv* env, jobject obj,
    JniIntWrapper p0,
    jobject p1) __attribute__ ((unused));
static void Java_MotionEvent_getPointerProperties(JNIEnv* env, jobject obj,
    JniIntWrapper p0,
    jobject p1) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, obj,
      MotionEvent_clazz(env));
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_INSTANCE>(
      env, MotionEvent_clazz(env),
      "getPointerProperties",
      "(ILandroid/view/MotionEvent$PointerProperties;)V",
      &g_MotionEvent_getPointerProperties);

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

}

static base::subtle::AtomicWord g_MotionEvent_getMetaState = 0;
static jint Java_MotionEvent_getMetaState(JNIEnv* env, jobject obj)
    __attribute__ ((unused));
static jint Java_MotionEvent_getMetaState(JNIEnv* env, jobject obj) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, obj,
      MotionEvent_clazz(env), 0);
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_INSTANCE>(
      env, MotionEvent_clazz(env),
      "getMetaState",
      "()I",
      &g_MotionEvent_getMetaState);

  jint ret =
      env->CallIntMethod(obj,
          method_id);
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getButtonState = 0;
static jint Java_MotionEvent_getButtonState(JNIEnv* env, jobject obj)
    __attribute__ ((unused));
static jint Java_MotionEvent_getButtonState(JNIEnv* env, jobject obj) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, obj,
      MotionEvent_clazz(env), 0);
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_INSTANCE>(
      env, MotionEvent_clazz(env),
      "getButtonState",
      "()I",
      &g_MotionEvent_getButtonState);

  jint ret =
      env->CallIntMethod(obj,
          method_id);
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getRawX = 0;
static jfloat Java_MotionEvent_getRawX(JNIEnv* env, jobject obj) __attribute__
    ((unused));
static jfloat Java_MotionEvent_getRawX(JNIEnv* env, jobject obj) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, obj,
      MotionEvent_clazz(env), 0);
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_INSTANCE>(
      env, MotionEvent_clazz(env),
      "getRawX",
      "()F",
      &g_MotionEvent_getRawX);

  jfloat ret =
      env->CallFloatMethod(obj,
          method_id);
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getRawY = 0;
static jfloat Java_MotionEvent_getRawY(JNIEnv* env, jobject obj) __attribute__
    ((unused));
static jfloat Java_MotionEvent_getRawY(JNIEnv* env, jobject obj) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, obj,
      MotionEvent_clazz(env), 0);
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_INSTANCE>(
      env, MotionEvent_clazz(env),
      "getRawY",
      "()F",
      &g_MotionEvent_getRawY);

  jfloat ret =
      env->CallFloatMethod(obj,
          method_id);
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getXPrecision = 0;
static jfloat Java_MotionEvent_getXPrecision(JNIEnv* env, jobject obj)
    __attribute__ ((unused));
static jfloat Java_MotionEvent_getXPrecision(JNIEnv* env, jobject obj) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, obj,
      MotionEvent_clazz(env), 0);
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_INSTANCE>(
      env, MotionEvent_clazz(env),
      "getXPrecision",
      "()F",
      &g_MotionEvent_getXPrecision);

  jfloat ret =
      env->CallFloatMethod(obj,
          method_id);
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getYPrecision = 0;
static jfloat Java_MotionEvent_getYPrecision(JNIEnv* env, jobject obj)
    __attribute__ ((unused));
static jfloat Java_MotionEvent_getYPrecision(JNIEnv* env, jobject obj) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, obj,
      MotionEvent_clazz(env), 0);
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_INSTANCE>(
      env, MotionEvent_clazz(env),
      "getYPrecision",
      "()F",
      &g_MotionEvent_getYPrecision);

  jfloat ret =
      env->CallFloatMethod(obj,
          method_id);
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getHistorySize = 0;
static jint Java_MotionEvent_getHistorySize(JNIEnv* env, jobject obj)
    __attribute__ ((unused));
static jint Java_MotionEvent_getHistorySize(JNIEnv* env, jobject obj) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, obj,
      MotionEvent_clazz(env), 0);
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_INSTANCE>(
      env, MotionEvent_clazz(env),
      "getHistorySize",
      "()I",
      &g_MotionEvent_getHistorySize);

  jint ret =
      env->CallIntMethod(obj,
          method_id);
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getHistoricalEventTime = 0;
static jlong Java_MotionEvent_getHistoricalEventTime(JNIEnv* env, jobject obj,
    JniIntWrapper p0) __attribute__ ((unused));
static jlong Java_MotionEvent_getHistoricalEventTime(JNIEnv* env, jobject obj,
    JniIntWrapper p0) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, obj,
      MotionEvent_clazz(env), 0);
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_INSTANCE>(
      env, MotionEvent_clazz(env),
      "getHistoricalEventTime",
      "(I)J",
      &g_MotionEvent_getHistoricalEventTime);

  jlong ret =
      env->CallLongMethod(obj,
          method_id, as_jint(p0));
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getHistoricalXF_I = 0;
static jfloat Java_MotionEvent_getHistoricalXF_I(JNIEnv* env, jobject obj,
    JniIntWrapper p0) __attribute__ ((unused));
static jfloat Java_MotionEvent_getHistoricalXF_I(JNIEnv* env, jobject obj,
    JniIntWrapper p0) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, obj,
      MotionEvent_clazz(env), 0);
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_INSTANCE>(
      env, MotionEvent_clazz(env),
      "getHistoricalX",
      "(I)F",
      &g_MotionEvent_getHistoricalXF_I);

  jfloat ret =
      env->CallFloatMethod(obj,
          method_id, as_jint(p0));
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getHistoricalYF_I = 0;
static jfloat Java_MotionEvent_getHistoricalYF_I(JNIEnv* env, jobject obj,
    JniIntWrapper p0) __attribute__ ((unused));
static jfloat Java_MotionEvent_getHistoricalYF_I(JNIEnv* env, jobject obj,
    JniIntWrapper p0) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, obj,
      MotionEvent_clazz(env), 0);
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_INSTANCE>(
      env, MotionEvent_clazz(env),
      "getHistoricalY",
      "(I)F",
      &g_MotionEvent_getHistoricalYF_I);

  jfloat ret =
      env->CallFloatMethod(obj,
          method_id, as_jint(p0));
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getHistoricalPressureF_I = 0;
static jfloat Java_MotionEvent_getHistoricalPressureF_I(JNIEnv* env, jobject
    obj, JniIntWrapper p0) __attribute__ ((unused));
static jfloat Java_MotionEvent_getHistoricalPressureF_I(JNIEnv* env, jobject
    obj, JniIntWrapper p0) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, obj,
      MotionEvent_clazz(env), 0);
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_INSTANCE>(
      env, MotionEvent_clazz(env),
      "getHistoricalPressure",
      "(I)F",
      &g_MotionEvent_getHistoricalPressureF_I);

  jfloat ret =
      env->CallFloatMethod(obj,
          method_id, as_jint(p0));
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getHistoricalSizeF_I = 0;
static jfloat Java_MotionEvent_getHistoricalSizeF_I(JNIEnv* env, jobject obj,
    JniIntWrapper p0) __attribute__ ((unused));
static jfloat Java_MotionEvent_getHistoricalSizeF_I(JNIEnv* env, jobject obj,
    JniIntWrapper p0) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, obj,
      MotionEvent_clazz(env), 0);
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_INSTANCE>(
      env, MotionEvent_clazz(env),
      "getHistoricalSize",
      "(I)F",
      &g_MotionEvent_getHistoricalSizeF_I);

  jfloat ret =
      env->CallFloatMethod(obj,
          method_id, as_jint(p0));
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getHistoricalTouchMajorF_I = 0;
static jfloat Java_MotionEvent_getHistoricalTouchMajorF_I(JNIEnv* env, jobject
    obj, JniIntWrapper p0) __attribute__ ((unused));
static jfloat Java_MotionEvent_getHistoricalTouchMajorF_I(JNIEnv* env, jobject
    obj, JniIntWrapper p0) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, obj,
      MotionEvent_clazz(env), 0);
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_INSTANCE>(
      env, MotionEvent_clazz(env),
      "getHistoricalTouchMajor",
      "(I)F",
      &g_MotionEvent_getHistoricalTouchMajorF_I);

  jfloat ret =
      env->CallFloatMethod(obj,
          method_id, as_jint(p0));
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getHistoricalTouchMinorF_I = 0;
static jfloat Java_MotionEvent_getHistoricalTouchMinorF_I(JNIEnv* env, jobject
    obj, JniIntWrapper p0) __attribute__ ((unused));
static jfloat Java_MotionEvent_getHistoricalTouchMinorF_I(JNIEnv* env, jobject
    obj, JniIntWrapper p0) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, obj,
      MotionEvent_clazz(env), 0);
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_INSTANCE>(
      env, MotionEvent_clazz(env),
      "getHistoricalTouchMinor",
      "(I)F",
      &g_MotionEvent_getHistoricalTouchMinorF_I);

  jfloat ret =
      env->CallFloatMethod(obj,
          method_id, as_jint(p0));
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getHistoricalToolMajorF_I = 0;
static jfloat Java_MotionEvent_getHistoricalToolMajorF_I(JNIEnv* env, jobject
    obj, JniIntWrapper p0) __attribute__ ((unused));
static jfloat Java_MotionEvent_getHistoricalToolMajorF_I(JNIEnv* env, jobject
    obj, JniIntWrapper p0) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, obj,
      MotionEvent_clazz(env), 0);
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_INSTANCE>(
      env, MotionEvent_clazz(env),
      "getHistoricalToolMajor",
      "(I)F",
      &g_MotionEvent_getHistoricalToolMajorF_I);

  jfloat ret =
      env->CallFloatMethod(obj,
          method_id, as_jint(p0));
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getHistoricalToolMinorF_I = 0;
static jfloat Java_MotionEvent_getHistoricalToolMinorF_I(JNIEnv* env, jobject
    obj, JniIntWrapper p0) __attribute__ ((unused));
static jfloat Java_MotionEvent_getHistoricalToolMinorF_I(JNIEnv* env, jobject
    obj, JniIntWrapper p0) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, obj,
      MotionEvent_clazz(env), 0);
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_INSTANCE>(
      env, MotionEvent_clazz(env),
      "getHistoricalToolMinor",
      "(I)F",
      &g_MotionEvent_getHistoricalToolMinorF_I);

  jfloat ret =
      env->CallFloatMethod(obj,
          method_id, as_jint(p0));
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getHistoricalOrientationF_I = 0;
static jfloat Java_MotionEvent_getHistoricalOrientationF_I(JNIEnv* env, jobject
    obj, JniIntWrapper p0) __attribute__ ((unused));
static jfloat Java_MotionEvent_getHistoricalOrientationF_I(JNIEnv* env, jobject
    obj, JniIntWrapper p0) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, obj,
      MotionEvent_clazz(env), 0);
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_INSTANCE>(
      env, MotionEvent_clazz(env),
      "getHistoricalOrientation",
      "(I)F",
      &g_MotionEvent_getHistoricalOrientationF_I);

  jfloat ret =
      env->CallFloatMethod(obj,
          method_id, as_jint(p0));
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getHistoricalAxisValueF_I_I = 0;
static jfloat Java_MotionEvent_getHistoricalAxisValueF_I_I(JNIEnv* env, jobject
    obj, JniIntWrapper p0,
    JniIntWrapper p1) __attribute__ ((unused));
static jfloat Java_MotionEvent_getHistoricalAxisValueF_I_I(JNIEnv* env, jobject
    obj, JniIntWrapper p0,
    JniIntWrapper p1) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, obj,
      MotionEvent_clazz(env), 0);
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_INSTANCE>(
      env, MotionEvent_clazz(env),
      "getHistoricalAxisValue",
      "(II)F",
      &g_MotionEvent_getHistoricalAxisValueF_I_I);

  jfloat ret =
      env->CallFloatMethod(obj,
          method_id, as_jint(p0), as_jint(p1));
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getHistoricalXF_I_I = 0;
static jfloat Java_MotionEvent_getHistoricalXF_I_I(JNIEnv* env, jobject obj,
    JniIntWrapper p0,
    JniIntWrapper p1) __attribute__ ((unused));
static jfloat Java_MotionEvent_getHistoricalXF_I_I(JNIEnv* env, jobject obj,
    JniIntWrapper p0,
    JniIntWrapper p1) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, obj,
      MotionEvent_clazz(env), 0);
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_INSTANCE>(
      env, MotionEvent_clazz(env),
      "getHistoricalX",
      "(II)F",
      &g_MotionEvent_getHistoricalXF_I_I);

  jfloat ret =
      env->CallFloatMethod(obj,
          method_id, as_jint(p0), as_jint(p1));
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getHistoricalYF_I_I = 0;
static jfloat Java_MotionEvent_getHistoricalYF_I_I(JNIEnv* env, jobject obj,
    JniIntWrapper p0,
    JniIntWrapper p1) __attribute__ ((unused));
static jfloat Java_MotionEvent_getHistoricalYF_I_I(JNIEnv* env, jobject obj,
    JniIntWrapper p0,
    JniIntWrapper p1) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, obj,
      MotionEvent_clazz(env), 0);
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_INSTANCE>(
      env, MotionEvent_clazz(env),
      "getHistoricalY",
      "(II)F",
      &g_MotionEvent_getHistoricalYF_I_I);

  jfloat ret =
      env->CallFloatMethod(obj,
          method_id, as_jint(p0), as_jint(p1));
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getHistoricalPressureF_I_I = 0;
static jfloat Java_MotionEvent_getHistoricalPressureF_I_I(JNIEnv* env, jobject
    obj, JniIntWrapper p0,
    JniIntWrapper p1) __attribute__ ((unused));
static jfloat Java_MotionEvent_getHistoricalPressureF_I_I(JNIEnv* env, jobject
    obj, JniIntWrapper p0,
    JniIntWrapper p1) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, obj,
      MotionEvent_clazz(env), 0);
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_INSTANCE>(
      env, MotionEvent_clazz(env),
      "getHistoricalPressure",
      "(II)F",
      &g_MotionEvent_getHistoricalPressureF_I_I);

  jfloat ret =
      env->CallFloatMethod(obj,
          method_id, as_jint(p0), as_jint(p1));
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getHistoricalSizeF_I_I = 0;
static jfloat Java_MotionEvent_getHistoricalSizeF_I_I(JNIEnv* env, jobject obj,
    JniIntWrapper p0,
    JniIntWrapper p1) __attribute__ ((unused));
static jfloat Java_MotionEvent_getHistoricalSizeF_I_I(JNIEnv* env, jobject obj,
    JniIntWrapper p0,
    JniIntWrapper p1) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, obj,
      MotionEvent_clazz(env), 0);
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_INSTANCE>(
      env, MotionEvent_clazz(env),
      "getHistoricalSize",
      "(II)F",
      &g_MotionEvent_getHistoricalSizeF_I_I);

  jfloat ret =
      env->CallFloatMethod(obj,
          method_id, as_jint(p0), as_jint(p1));
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getHistoricalTouchMajorF_I_I = 0;
static jfloat Java_MotionEvent_getHistoricalTouchMajorF_I_I(JNIEnv* env, jobject
    obj, JniIntWrapper p0,
    JniIntWrapper p1) __attribute__ ((unused));
static jfloat Java_MotionEvent_getHistoricalTouchMajorF_I_I(JNIEnv* env, jobject
    obj, JniIntWrapper p0,
    JniIntWrapper p1) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, obj,
      MotionEvent_clazz(env), 0);
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_INSTANCE>(
      env, MotionEvent_clazz(env),
      "getHistoricalTouchMajor",
      "(II)F",
      &g_MotionEvent_getHistoricalTouchMajorF_I_I);

  jfloat ret =
      env->CallFloatMethod(obj,
          method_id, as_jint(p0), as_jint(p1));
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getHistoricalTouchMinorF_I_I = 0;
static jfloat Java_MotionEvent_getHistoricalTouchMinorF_I_I(JNIEnv* env, jobject
    obj, JniIntWrapper p0,
    JniIntWrapper p1) __attribute__ ((unused));
static jfloat Java_MotionEvent_getHistoricalTouchMinorF_I_I(JNIEnv* env, jobject
    obj, JniIntWrapper p0,
    JniIntWrapper p1) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, obj,
      MotionEvent_clazz(env), 0);
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_INSTANCE>(
      env, MotionEvent_clazz(env),
      "getHistoricalTouchMinor",
      "(II)F",
      &g_MotionEvent_getHistoricalTouchMinorF_I_I);

  jfloat ret =
      env->CallFloatMethod(obj,
          method_id, as_jint(p0), as_jint(p1));
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getHistoricalToolMajorF_I_I = 0;
static jfloat Java_MotionEvent_getHistoricalToolMajorF_I_I(JNIEnv* env, jobject
    obj, JniIntWrapper p0,
    JniIntWrapper p1) __attribute__ ((unused));
static jfloat Java_MotionEvent_getHistoricalToolMajorF_I_I(JNIEnv* env, jobject
    obj, JniIntWrapper p0,
    JniIntWrapper p1) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, obj,
      MotionEvent_clazz(env), 0);
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_INSTANCE>(
      env, MotionEvent_clazz(env),
      "getHistoricalToolMajor",
      "(II)F",
      &g_MotionEvent_getHistoricalToolMajorF_I_I);

  jfloat ret =
      env->CallFloatMethod(obj,
          method_id, as_jint(p0), as_jint(p1));
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getHistoricalToolMinorF_I_I = 0;
static jfloat Java_MotionEvent_getHistoricalToolMinorF_I_I(JNIEnv* env, jobject
    obj, JniIntWrapper p0,
    JniIntWrapper p1) __attribute__ ((unused));
static jfloat Java_MotionEvent_getHistoricalToolMinorF_I_I(JNIEnv* env, jobject
    obj, JniIntWrapper p0,
    JniIntWrapper p1) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, obj,
      MotionEvent_clazz(env), 0);
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_INSTANCE>(
      env, MotionEvent_clazz(env),
      "getHistoricalToolMinor",
      "(II)F",
      &g_MotionEvent_getHistoricalToolMinorF_I_I);

  jfloat ret =
      env->CallFloatMethod(obj,
          method_id, as_jint(p0), as_jint(p1));
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getHistoricalOrientationF_I_I = 0;
static jfloat Java_MotionEvent_getHistoricalOrientationF_I_I(JNIEnv* env,
    jobject obj, JniIntWrapper p0,
    JniIntWrapper p1) __attribute__ ((unused));
static jfloat Java_MotionEvent_getHistoricalOrientationF_I_I(JNIEnv* env,
    jobject obj, JniIntWrapper p0,
    JniIntWrapper p1) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, obj,
      MotionEvent_clazz(env), 0);
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_INSTANCE>(
      env, MotionEvent_clazz(env),
      "getHistoricalOrientation",
      "(II)F",
      &g_MotionEvent_getHistoricalOrientationF_I_I);

  jfloat ret =
      env->CallFloatMethod(obj,
          method_id, as_jint(p0), as_jint(p1));
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getHistoricalAxisValueF_I_I_I = 0;
static jfloat Java_MotionEvent_getHistoricalAxisValueF_I_I_I(JNIEnv* env,
    jobject obj, JniIntWrapper p0,
    JniIntWrapper p1,
    JniIntWrapper p2) __attribute__ ((unused));
static jfloat Java_MotionEvent_getHistoricalAxisValueF_I_I_I(JNIEnv* env,
    jobject obj, JniIntWrapper p0,
    JniIntWrapper p1,
    JniIntWrapper p2) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, obj,
      MotionEvent_clazz(env), 0);
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_INSTANCE>(
      env, MotionEvent_clazz(env),
      "getHistoricalAxisValue",
      "(III)F",
      &g_MotionEvent_getHistoricalAxisValueF_I_I_I);

  jfloat ret =
      env->CallFloatMethod(obj,
          method_id, as_jint(p0), as_jint(p1), as_jint(p2));
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getHistoricalPointerCoords = 0;
static void Java_MotionEvent_getHistoricalPointerCoords(JNIEnv* env, jobject
    obj, JniIntWrapper p0,
    JniIntWrapper p1,
    jobject p2) __attribute__ ((unused));
static void Java_MotionEvent_getHistoricalPointerCoords(JNIEnv* env, jobject
    obj, JniIntWrapper p0,
    JniIntWrapper p1,
    jobject p2) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, obj,
      MotionEvent_clazz(env));
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_INSTANCE>(
      env, MotionEvent_clazz(env),
      "getHistoricalPointerCoords",
      "(IILandroid/view/MotionEvent$PointerCoords;)V",
      &g_MotionEvent_getHistoricalPointerCoords);

     env->CallVoidMethod(obj,
          method_id, as_jint(p0), as_jint(p1), p2);
  jni_generator::CheckException(env);

}

static base::subtle::AtomicWord g_MotionEvent_getEdgeFlags = 0;
static jint Java_MotionEvent_getEdgeFlags(JNIEnv* env, jobject obj)
    __attribute__ ((unused));
static jint Java_MotionEvent_getEdgeFlags(JNIEnv* env, jobject obj) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, obj,
      MotionEvent_clazz(env), 0);
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_INSTANCE>(
      env, MotionEvent_clazz(env),
      "getEdgeFlags",
      "()I",
      &g_MotionEvent_getEdgeFlags);

  jint ret =
      env->CallIntMethod(obj,
          method_id);
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_setEdgeFlags = 0;
static void Java_MotionEvent_setEdgeFlags(JNIEnv* env, jobject obj,
    JniIntWrapper p0) __attribute__ ((unused));
static void Java_MotionEvent_setEdgeFlags(JNIEnv* env, jobject obj,
    JniIntWrapper p0) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, obj,
      MotionEvent_clazz(env));
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_INSTANCE>(
      env, MotionEvent_clazz(env),
      "setEdgeFlags",
      "(I)V",
      &g_MotionEvent_setEdgeFlags);

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

}

static base::subtle::AtomicWord g_MotionEvent_setAction = 0;
static void Java_MotionEvent_setAction(JNIEnv* env, jobject obj, JniIntWrapper
    p0) __attribute__ ((unused));
static void Java_MotionEvent_setAction(JNIEnv* env, jobject obj, JniIntWrapper
    p0) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, obj,
      MotionEvent_clazz(env));
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_INSTANCE>(
      env, MotionEvent_clazz(env),
      "setAction",
      "(I)V",
      &g_MotionEvent_setAction);

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

}

static base::subtle::AtomicWord g_MotionEvent_offsetLocation = 0;
static void Java_MotionEvent_offsetLocation(JNIEnv* env, jobject obj, jfloat p0,
    jfloat p1) __attribute__ ((unused));
static void Java_MotionEvent_offsetLocation(JNIEnv* env, jobject obj, jfloat p0,
    jfloat p1) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, obj,
      MotionEvent_clazz(env));
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_INSTANCE>(
      env, MotionEvent_clazz(env),
      "offsetLocation",
      "(FF)V",
      &g_MotionEvent_offsetLocation);

     env->CallVoidMethod(obj,
          method_id, p0, p1);
  jni_generator::CheckException(env);

}

static base::subtle::AtomicWord g_MotionEvent_setLocation = 0;
static void Java_MotionEvent_setLocation(JNIEnv* env, jobject obj, jfloat p0,
    jfloat p1) __attribute__ ((unused));
static void Java_MotionEvent_setLocation(JNIEnv* env, jobject obj, jfloat p0,
    jfloat p1) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, obj,
      MotionEvent_clazz(env));
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_INSTANCE>(
      env, MotionEvent_clazz(env),
      "setLocation",
      "(FF)V",
      &g_MotionEvent_setLocation);

     env->CallVoidMethod(obj,
          method_id, p0, p1);
  jni_generator::CheckException(env);

}

static base::subtle::AtomicWord g_MotionEvent_transform = 0;
static void Java_MotionEvent_transform(JNIEnv* env, jobject obj, jobject p0)
    __attribute__ ((unused));
static void Java_MotionEvent_transform(JNIEnv* env, jobject obj, jobject p0) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, obj,
      MotionEvent_clazz(env));
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_INSTANCE>(
      env, MotionEvent_clazz(env),
      "transform",
      "(Landroid/graphics/Matrix;)V",
      &g_MotionEvent_transform);

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

}

static base::subtle::AtomicWord g_MotionEvent_addBatchV_J_F_F_F_F_I = 0;
static void Java_MotionEvent_addBatchV_J_F_F_F_F_I(JNIEnv* env, jobject obj,
    jlong p0,
    jfloat p1,
    jfloat p2,
    jfloat p3,
    jfloat p4,
    JniIntWrapper p5) __attribute__ ((unused));
static void Java_MotionEvent_addBatchV_J_F_F_F_F_I(JNIEnv* env, jobject obj,
    jlong p0,
    jfloat p1,
    jfloat p2,
    jfloat p3,
    jfloat p4,
    JniIntWrapper p5) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, obj,
      MotionEvent_clazz(env));
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_INSTANCE>(
      env, MotionEvent_clazz(env),
      "addBatch",
      "(JFFFFI)V",
      &g_MotionEvent_addBatchV_J_F_F_F_F_I);

     env->CallVoidMethod(obj,
          method_id, p0, p1, p2, p3, p4, as_jint(p5));
  jni_generator::CheckException(env);

}

static base::subtle::AtomicWord g_MotionEvent_addBatchV_J_LAVMEPC_I = 0;
static void Java_MotionEvent_addBatchV_J_LAVMEPC_I(JNIEnv* env, jobject obj,
    jlong p0,
    jobjectArray p1,
    JniIntWrapper p2) __attribute__ ((unused));
static void Java_MotionEvent_addBatchV_J_LAVMEPC_I(JNIEnv* env, jobject obj,
    jlong p0,
    jobjectArray p1,
    JniIntWrapper p2) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, obj,
      MotionEvent_clazz(env));
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_INSTANCE>(
      env, MotionEvent_clazz(env),
      "addBatch",
      "(J[Landroid/view/MotionEvent$PointerCoords;I)V",
      &g_MotionEvent_addBatchV_J_LAVMEPC_I);

     env->CallVoidMethod(obj,
          method_id, p0, p1, as_jint(p2));
  jni_generator::CheckException(env);

}

static base::subtle::AtomicWord g_MotionEvent_toString = 0;
static ScopedJavaLocalRef<jstring> Java_MotionEvent_toString(JNIEnv* env,
    jobject obj) __attribute__ ((unused));
static ScopedJavaLocalRef<jstring> Java_MotionEvent_toString(JNIEnv* env,
    jobject obj) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, obj,
      MotionEvent_clazz(env), NULL);
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_INSTANCE>(
      env, MotionEvent_clazz(env),
      "toString",
      "()Ljava/lang/String;",
      &g_MotionEvent_toString);

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

static base::subtle::AtomicWord g_MotionEvent_actionToString = 0;
static ScopedJavaLocalRef<jstring> Java_MotionEvent_actionToString(JNIEnv* env,
    JniIntWrapper p0) __attribute__ ((unused));
static ScopedJavaLocalRef<jstring> Java_MotionEvent_actionToString(JNIEnv* env,
    JniIntWrapper p0) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, MotionEvent_clazz(env),
      MotionEvent_clazz(env), NULL);
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_STATIC>(
      env, MotionEvent_clazz(env),
      "actionToString",
      "(I)Ljava/lang/String;",
      &g_MotionEvent_actionToString);

  jstring ret =
      static_cast<jstring>(env->CallStaticObjectMethod(MotionEvent_clazz(env),
          method_id, as_jint(p0)));
  jni_generator::CheckException(env);
  return ScopedJavaLocalRef<jstring>(env, ret);
}

static base::subtle::AtomicWord g_MotionEvent_axisToString = 0;
static ScopedJavaLocalRef<jstring> Java_MotionEvent_axisToString(JNIEnv* env,
    JniIntWrapper p0) __attribute__ ((unused));
static ScopedJavaLocalRef<jstring> Java_MotionEvent_axisToString(JNIEnv* env,
    JniIntWrapper p0) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, MotionEvent_clazz(env),
      MotionEvent_clazz(env), NULL);
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_STATIC>(
      env, MotionEvent_clazz(env),
      "axisToString",
      "(I)Ljava/lang/String;",
      &g_MotionEvent_axisToString);

  jstring ret =
      static_cast<jstring>(env->CallStaticObjectMethod(MotionEvent_clazz(env),
          method_id, as_jint(p0)));
  jni_generator::CheckException(env);
  return ScopedJavaLocalRef<jstring>(env, ret);
}

static base::subtle::AtomicWord g_MotionEvent_axisFromString = 0;
static jint Java_MotionEvent_axisFromString(JNIEnv* env, jstring p0)
    __attribute__ ((unused));
static jint Java_MotionEvent_axisFromString(JNIEnv* env, jstring p0) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, MotionEvent_clazz(env),
      MotionEvent_clazz(env), 0);
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_STATIC>(
      env, MotionEvent_clazz(env),
      "axisFromString",
      "(Ljava/lang/String;)I",
      &g_MotionEvent_axisFromString);

  jint ret =
      env->CallStaticIntMethod(MotionEvent_clazz(env),
          method_id, p0);
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_writeToParcel = 0;
static void Java_MotionEvent_writeToParcel(JNIEnv* env, jobject obj, jobject p0,
    JniIntWrapper p1) __attribute__ ((unused));
static void Java_MotionEvent_writeToParcel(JNIEnv* env, jobject obj, jobject p0,
    JniIntWrapper p1) {
  /* Must call RegisterNativesImpl()  */
  CHECK_CLAZZ(env, obj,
      MotionEvent_clazz(env));
  jmethodID method_id =
      base::android::MethodID::LazyGet<
      base::android::MethodID::TYPE_INSTANCE>(
      env, MotionEvent_clazz(env),
      "writeToParcel",
      "(Landroid/os/Parcel;I)V",
      &g_MotionEvent_writeToParcel);

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

}

// Step 3: RegisterNatives.

static bool RegisterNativesImpl(JNIEnv* env) {

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

  return true;
}

}  // namespace JNI_MotionEvent

#endif  // android_view_MotionEvent_JNI
