// 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 base::android::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 base::android::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 base::android::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 base::android::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 base::android::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 base::android::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 base::android::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 base::android::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 base::android::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 base::android::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 base::android::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 base::android::ScopedJavaLocalRef<jobject>(env, ret);
}

static base::subtle::AtomicWord g_MotionEvent_obtainAVME_J_J_I_F_F_I = 0;
static base::android::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 base::android::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 base::android::ScopedJavaLocalRef<jobject>(env, ret);
}

static base::subtle::AtomicWord g_MotionEvent_obtainAVME_AVME = 0;
static base::android::ScopedJavaLocalRef<jobject>
    Java_MotionEvent_obtainAVME_AVME(JNIEnv* env, jobject p0) __attribute__
    ((unused));
static base::android::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 base::android::ScopedJavaLocalRef<jobject>(env, ret);
}

static base::subtle::AtomicWord g_MotionEvent_obtainNoHistory = 0;
static base::android::ScopedJavaLocalRef<jobject>
    Java_MotionEvent_obtainNoHistory(JNIEnv* env, jobject p0) __attribute__
    ((unused));
static base::android::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 base::android::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 base::android::ScopedJavaLocalRef<jstring>
    Java_MotionEvent_toString(JNIEnv* env, jobject obj) __attribute__
    ((unused));
static base::android::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 base::android::ScopedJavaLocalRef<jstring>(env, ret);
}

static base::subtle::AtomicWord g_MotionEvent_actionToString = 0;
static base::android::ScopedJavaLocalRef<jstring>
    Java_MotionEvent_actionToString(JNIEnv* env, JniIntWrapper p0) __attribute__
    ((unused));
static base::android::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 base::android::ScopedJavaLocalRef<jstring>(env, ret);
}

static base::subtle::AtomicWord g_MotionEvent_axisToString = 0;
static base::android::ScopedJavaLocalRef<jstring>
    Java_MotionEvent_axisToString(JNIEnv* env, JniIntWrapper p0) __attribute__
    ((unused));
static base::android::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 base::android::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
