// 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.
base::subtle::AtomicWord g_MotionEvent_clazz __attribute__((unused)) = 0;
#define MotionEvent_clazz(env) base::android::LazyGetClass(env, kMotionEventClassPath, &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, const
    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
static void Java_MotionEvent_finalize(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj) {
  CHECK_CLAZZ(env, obj.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.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,
    const base::android::JavaRefOrBare<jobjectArray>& p4,
    const base::android::JavaRefOrBare<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,
    const base::android::JavaRefOrBare<jobjectArray>& p4,
    const base::android::JavaRefOrBare<jobjectArray>& p5,
    JniIntWrapper p6,
    JniIntWrapper p7,
    jfloat p8,
    jfloat p9,
    JniIntWrapper p10,
    JniIntWrapper p11,
    JniIntWrapper p12,
    JniIntWrapper p13) {
  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.obj(), p5.obj(),
              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,
    const base::android::JavaRefOrBare<jintArray>& p4,
    const base::android::JavaRefOrBare<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,
    const base::android::JavaRefOrBare<jintArray>& p4,
    const base::android::JavaRefOrBare<jobjectArray>& p5,
    JniIntWrapper p6,
    jfloat p7,
    jfloat p8,
    JniIntWrapper p9,
    JniIntWrapper p10,
    JniIntWrapper p11,
    JniIntWrapper p12) {
  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.obj(), p5.obj(),
              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) {
  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) {
  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) {
  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, const
    base::android::JavaRefOrBare<jobject>& p0) __attribute__ ((unused));
static base::android::ScopedJavaLocalRef<jobject>
    Java_MotionEvent_obtainAVME_AVME(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& p0) {
  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.obj());
  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, const
    base::android::JavaRefOrBare<jobject>& p0) __attribute__ ((unused));
static base::android::ScopedJavaLocalRef<jobject>
    Java_MotionEvent_obtainNoHistory(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& p0) {
  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.obj());
  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, const
    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
static void Java_MotionEvent_recycle(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj) {
  CHECK_CLAZZ(env, obj.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.obj(),
          method_id);
  jni_generator::CheckException(env);
}

static base::subtle::AtomicWord g_MotionEvent_getDeviceId = 0;
static jint Java_MotionEvent_getDeviceId(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
static jint Java_MotionEvent_getDeviceId(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj) {
  CHECK_CLAZZ(env, obj.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.obj(),
          method_id);
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getSource = 0;
static jint Java_MotionEvent_getSource(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
static jint Java_MotionEvent_getSource(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj) {
  CHECK_CLAZZ(env, obj.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.obj(),
          method_id);
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_setSource = 0;
static void Java_MotionEvent_setSource(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
    ((unused));
static void Java_MotionEvent_setSource(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
  CHECK_CLAZZ(env, obj.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.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, const
    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
static jint Java_MotionEvent_getAction(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj) {
  CHECK_CLAZZ(env, obj.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.obj(),
          method_id);
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getActionMasked = 0;
static jint Java_MotionEvent_getActionMasked(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
static jint Java_MotionEvent_getActionMasked(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj) {
  CHECK_CLAZZ(env, obj.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.obj(),
          method_id);
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getActionIndex = 0;
static jint Java_MotionEvent_getActionIndex(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
static jint Java_MotionEvent_getActionIndex(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj) {
  CHECK_CLAZZ(env, obj.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.obj(),
          method_id);
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getFlags = 0;
static jint Java_MotionEvent_getFlags(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
static jint Java_MotionEvent_getFlags(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj) {
  CHECK_CLAZZ(env, obj.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.obj(),
          method_id);
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getDownTime = 0;
static jlong Java_MotionEvent_getDownTime(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
static jlong Java_MotionEvent_getDownTime(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj) {
  CHECK_CLAZZ(env, obj.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.obj(),
          method_id);
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getEventTime = 0;
static jlong Java_MotionEvent_getEventTime(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
static jlong Java_MotionEvent_getEventTime(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj) {
  CHECK_CLAZZ(env, obj.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.obj(),
          method_id);
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getXF = 0;
static jfloat Java_MotionEvent_getXF(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
static jfloat Java_MotionEvent_getXF(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj) {
  CHECK_CLAZZ(env, obj.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.obj(),
          method_id);
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getYF = 0;
static jfloat Java_MotionEvent_getYF(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
static jfloat Java_MotionEvent_getYF(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj) {
  CHECK_CLAZZ(env, obj.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.obj(),
          method_id);
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getPressureF = 0;
static jfloat Java_MotionEvent_getPressureF(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
static jfloat Java_MotionEvent_getPressureF(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj) {
  CHECK_CLAZZ(env, obj.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.obj(),
          method_id);
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getSizeF = 0;
static jfloat Java_MotionEvent_getSizeF(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
static jfloat Java_MotionEvent_getSizeF(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj) {
  CHECK_CLAZZ(env, obj.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.obj(),
          method_id);
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getTouchMajorF = 0;
static jfloat Java_MotionEvent_getTouchMajorF(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
static jfloat Java_MotionEvent_getTouchMajorF(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj) {
  CHECK_CLAZZ(env, obj.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.obj(),
          method_id);
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getTouchMinorF = 0;
static jfloat Java_MotionEvent_getTouchMinorF(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
static jfloat Java_MotionEvent_getTouchMinorF(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj) {
  CHECK_CLAZZ(env, obj.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.obj(),
          method_id);
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getToolMajorF = 0;
static jfloat Java_MotionEvent_getToolMajorF(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
static jfloat Java_MotionEvent_getToolMajorF(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj) {
  CHECK_CLAZZ(env, obj.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.obj(),
          method_id);
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getToolMinorF = 0;
static jfloat Java_MotionEvent_getToolMinorF(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
static jfloat Java_MotionEvent_getToolMinorF(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj) {
  CHECK_CLAZZ(env, obj.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.obj(),
          method_id);
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getOrientationF = 0;
static jfloat Java_MotionEvent_getOrientationF(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
static jfloat Java_MotionEvent_getOrientationF(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj) {
  CHECK_CLAZZ(env, obj.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.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, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
    ((unused));
static jfloat Java_MotionEvent_getAxisValueF_I(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
  CHECK_CLAZZ(env, obj.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.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, const
    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
static jint Java_MotionEvent_getPointerCount(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj) {
  CHECK_CLAZZ(env, obj.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.obj(),
          method_id);
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getPointerId = 0;
static jint Java_MotionEvent_getPointerId(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
    ((unused));
static jint Java_MotionEvent_getPointerId(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
  CHECK_CLAZZ(env, obj.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.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, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
    ((unused));
static jint Java_MotionEvent_getToolType(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
  CHECK_CLAZZ(env, obj.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.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, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
    ((unused));
static jint Java_MotionEvent_findPointerIndex(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
  CHECK_CLAZZ(env, obj.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.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, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
    ((unused));
static jfloat Java_MotionEvent_getXF_I(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
  CHECK_CLAZZ(env, obj.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.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, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
    ((unused));
static jfloat Java_MotionEvent_getYF_I(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
  CHECK_CLAZZ(env, obj.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.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, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
    ((unused));
static jfloat Java_MotionEvent_getPressureF_I(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
  CHECK_CLAZZ(env, obj.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.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, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
    ((unused));
static jfloat Java_MotionEvent_getSizeF_I(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
  CHECK_CLAZZ(env, obj.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.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, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
    ((unused));
static jfloat Java_MotionEvent_getTouchMajorF_I(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
  CHECK_CLAZZ(env, obj.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.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, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
    ((unused));
static jfloat Java_MotionEvent_getTouchMinorF_I(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
  CHECK_CLAZZ(env, obj.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.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, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
    ((unused));
static jfloat Java_MotionEvent_getToolMajorF_I(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
  CHECK_CLAZZ(env, obj.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.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, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
    ((unused));
static jfloat Java_MotionEvent_getToolMinorF_I(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
  CHECK_CLAZZ(env, obj.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.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, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
    ((unused));
static jfloat Java_MotionEvent_getOrientationF_I(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
  CHECK_CLAZZ(env, obj.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.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, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
    JniIntWrapper p1) __attribute__ ((unused));
static jfloat Java_MotionEvent_getAxisValueF_I_I(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
    JniIntWrapper p1) {
  CHECK_CLAZZ(env, obj.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.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, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
    const base::android::JavaRefOrBare<jobject>& p1) __attribute__ ((unused));
static void Java_MotionEvent_getPointerCoords(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
    const base::android::JavaRefOrBare<jobject>& p1) {
  CHECK_CLAZZ(env, obj.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.obj(),
          method_id, as_jint(p0), p1.obj());
  jni_generator::CheckException(env);
}

static base::subtle::AtomicWord g_MotionEvent_getPointerProperties = 0;
static void Java_MotionEvent_getPointerProperties(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
    const base::android::JavaRefOrBare<jobject>& p1) __attribute__ ((unused));
static void Java_MotionEvent_getPointerProperties(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
    const base::android::JavaRefOrBare<jobject>& p1) {
  CHECK_CLAZZ(env, obj.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.obj(),
          method_id, as_jint(p0), p1.obj());
  jni_generator::CheckException(env);
}

static base::subtle::AtomicWord g_MotionEvent_getMetaState = 0;
static jint Java_MotionEvent_getMetaState(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
static jint Java_MotionEvent_getMetaState(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj) {
  CHECK_CLAZZ(env, obj.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.obj(),
          method_id);
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getButtonState = 0;
static jint Java_MotionEvent_getButtonState(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
static jint Java_MotionEvent_getButtonState(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj) {
  CHECK_CLAZZ(env, obj.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.obj(),
          method_id);
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getRawX = 0;
static jfloat Java_MotionEvent_getRawX(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
static jfloat Java_MotionEvent_getRawX(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj) {
  CHECK_CLAZZ(env, obj.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.obj(),
          method_id);
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getRawY = 0;
static jfloat Java_MotionEvent_getRawY(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
static jfloat Java_MotionEvent_getRawY(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj) {
  CHECK_CLAZZ(env, obj.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.obj(),
          method_id);
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getXPrecision = 0;
static jfloat Java_MotionEvent_getXPrecision(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
static jfloat Java_MotionEvent_getXPrecision(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj) {
  CHECK_CLAZZ(env, obj.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.obj(),
          method_id);
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getYPrecision = 0;
static jfloat Java_MotionEvent_getYPrecision(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
static jfloat Java_MotionEvent_getYPrecision(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj) {
  CHECK_CLAZZ(env, obj.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.obj(),
          method_id);
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getHistorySize = 0;
static jint Java_MotionEvent_getHistorySize(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
static jint Java_MotionEvent_getHistorySize(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj) {
  CHECK_CLAZZ(env, obj.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.obj(),
          method_id);
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_getHistoricalEventTime = 0;
static jlong Java_MotionEvent_getHistoricalEventTime(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
    ((unused));
static jlong Java_MotionEvent_getHistoricalEventTime(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
  CHECK_CLAZZ(env, obj.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.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, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
    ((unused));
static jfloat Java_MotionEvent_getHistoricalXF_I(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
  CHECK_CLAZZ(env, obj.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.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, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
    ((unused));
static jfloat Java_MotionEvent_getHistoricalYF_I(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
  CHECK_CLAZZ(env, obj.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.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, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
    ((unused));
static jfloat Java_MotionEvent_getHistoricalPressureF_I(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
  CHECK_CLAZZ(env, obj.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.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, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
    ((unused));
static jfloat Java_MotionEvent_getHistoricalSizeF_I(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
  CHECK_CLAZZ(env, obj.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.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, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
    ((unused));
static jfloat Java_MotionEvent_getHistoricalTouchMajorF_I(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
  CHECK_CLAZZ(env, obj.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.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, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
    ((unused));
static jfloat Java_MotionEvent_getHistoricalTouchMinorF_I(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
  CHECK_CLAZZ(env, obj.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.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, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
    ((unused));
static jfloat Java_MotionEvent_getHistoricalToolMajorF_I(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
  CHECK_CLAZZ(env, obj.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.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, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
    ((unused));
static jfloat Java_MotionEvent_getHistoricalToolMinorF_I(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
  CHECK_CLAZZ(env, obj.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.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, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
    ((unused));
static jfloat Java_MotionEvent_getHistoricalOrientationF_I(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
  CHECK_CLAZZ(env, obj.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.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, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
    JniIntWrapper p1) __attribute__ ((unused));
static jfloat Java_MotionEvent_getHistoricalAxisValueF_I_I(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
    JniIntWrapper p1) {
  CHECK_CLAZZ(env, obj.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.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, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
    JniIntWrapper p1) __attribute__ ((unused));
static jfloat Java_MotionEvent_getHistoricalXF_I_I(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
    JniIntWrapper p1) {
  CHECK_CLAZZ(env, obj.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.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, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
    JniIntWrapper p1) __attribute__ ((unused));
static jfloat Java_MotionEvent_getHistoricalYF_I_I(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
    JniIntWrapper p1) {
  CHECK_CLAZZ(env, obj.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.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, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
    JniIntWrapper p1) __attribute__ ((unused));
static jfloat Java_MotionEvent_getHistoricalPressureF_I_I(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
    JniIntWrapper p1) {
  CHECK_CLAZZ(env, obj.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.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, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
    JniIntWrapper p1) __attribute__ ((unused));
static jfloat Java_MotionEvent_getHistoricalSizeF_I_I(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
    JniIntWrapper p1) {
  CHECK_CLAZZ(env, obj.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.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, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
    JniIntWrapper p1) __attribute__ ((unused));
static jfloat Java_MotionEvent_getHistoricalTouchMajorF_I_I(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
    JniIntWrapper p1) {
  CHECK_CLAZZ(env, obj.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.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, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
    JniIntWrapper p1) __attribute__ ((unused));
static jfloat Java_MotionEvent_getHistoricalTouchMinorF_I_I(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
    JniIntWrapper p1) {
  CHECK_CLAZZ(env, obj.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.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, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
    JniIntWrapper p1) __attribute__ ((unused));
static jfloat Java_MotionEvent_getHistoricalToolMajorF_I_I(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
    JniIntWrapper p1) {
  CHECK_CLAZZ(env, obj.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.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, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
    JniIntWrapper p1) __attribute__ ((unused));
static jfloat Java_MotionEvent_getHistoricalToolMinorF_I_I(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
    JniIntWrapper p1) {
  CHECK_CLAZZ(env, obj.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.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, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
    JniIntWrapper p1) __attribute__ ((unused));
static jfloat Java_MotionEvent_getHistoricalOrientationF_I_I(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
    JniIntWrapper p1) {
  CHECK_CLAZZ(env, obj.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.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, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
    JniIntWrapper p1,
    JniIntWrapper p2) __attribute__ ((unused));
static jfloat Java_MotionEvent_getHistoricalAxisValueF_I_I_I(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
    JniIntWrapper p1,
    JniIntWrapper p2) {
  CHECK_CLAZZ(env, obj.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.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, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
    JniIntWrapper p1,
    const base::android::JavaRefOrBare<jobject>& p2) __attribute__ ((unused));
static void Java_MotionEvent_getHistoricalPointerCoords(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
    JniIntWrapper p1,
    const base::android::JavaRefOrBare<jobject>& p2) {
  CHECK_CLAZZ(env, obj.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.obj(),
          method_id, as_jint(p0), as_jint(p1), p2.obj());
  jni_generator::CheckException(env);
}

static base::subtle::AtomicWord g_MotionEvent_getEdgeFlags = 0;
static jint Java_MotionEvent_getEdgeFlags(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
static jint Java_MotionEvent_getEdgeFlags(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj) {
  CHECK_CLAZZ(env, obj.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.obj(),
          method_id);
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_setEdgeFlags = 0;
static void Java_MotionEvent_setEdgeFlags(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
    ((unused));
static void Java_MotionEvent_setEdgeFlags(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
  CHECK_CLAZZ(env, obj.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.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, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
    ((unused));
static void Java_MotionEvent_setAction(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
  CHECK_CLAZZ(env, obj.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.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, const
    base::android::JavaRefOrBare<jobject>& obj, jfloat p0,
    jfloat p1) __attribute__ ((unused));
static void Java_MotionEvent_offsetLocation(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj, jfloat p0,
    jfloat p1) {
  CHECK_CLAZZ(env, obj.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.obj(),
          method_id, p0, p1);
  jni_generator::CheckException(env);
}

static base::subtle::AtomicWord g_MotionEvent_setLocation = 0;
static void Java_MotionEvent_setLocation(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj, jfloat p0,
    jfloat p1) __attribute__ ((unused));
static void Java_MotionEvent_setLocation(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj, jfloat p0,
    jfloat p1) {
  CHECK_CLAZZ(env, obj.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.obj(),
          method_id, p0, p1);
  jni_generator::CheckException(env);
}

static base::subtle::AtomicWord g_MotionEvent_transform = 0;
static void Java_MotionEvent_transform(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj, const
    base::android::JavaRefOrBare<jobject>& p0) __attribute__ ((unused));
static void Java_MotionEvent_transform(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj, const
    base::android::JavaRefOrBare<jobject>& p0) {
  CHECK_CLAZZ(env, obj.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.obj(),
          method_id, p0.obj());
  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, const
    base::android::JavaRefOrBare<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, const
    base::android::JavaRefOrBare<jobject>& obj, jlong p0,
    jfloat p1,
    jfloat p2,
    jfloat p3,
    jfloat p4,
    JniIntWrapper p5) {
  CHECK_CLAZZ(env, obj.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.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, const
    base::android::JavaRefOrBare<jobject>& obj, jlong p0,
    const base::android::JavaRefOrBare<jobjectArray>& p1,
    JniIntWrapper p2) __attribute__ ((unused));
static void Java_MotionEvent_addBatchV_J_LAVMEPC_I(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj, jlong p0,
    const base::android::JavaRefOrBare<jobjectArray>& p1,
    JniIntWrapper p2) {
  CHECK_CLAZZ(env, obj.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.obj(),
          method_id, p0, p1.obj(), 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, const
    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
static base::android::ScopedJavaLocalRef<jstring>
    Java_MotionEvent_toString(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj) {
  CHECK_CLAZZ(env, obj.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.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) {
  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) {
  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, const
    base::android::JavaRefOrBare<jstring>& p0) __attribute__ ((unused));
static jint Java_MotionEvent_axisFromString(JNIEnv* env, const
    base::android::JavaRefOrBare<jstring>& p0) {
  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.obj());
  jni_generator::CheckException(env);
  return ret;
}

static base::subtle::AtomicWord g_MotionEvent_writeToParcel = 0;
static void Java_MotionEvent_writeToParcel(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj, const
    base::android::JavaRefOrBare<jobject>& p0,
    JniIntWrapper p1) __attribute__ ((unused));
static void Java_MotionEvent_writeToParcel(JNIEnv* env, const
    base::android::JavaRefOrBare<jobject>& obj, const
    base::android::JavaRefOrBare<jobject>& p0,
    JniIntWrapper p1) {
  CHECK_CLAZZ(env, obj.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.obj(),
          method_id, p0.obj(), as_jint(p1));
  jni_generator::CheckException(env);
}

// Step 3: RegisterNatives.

}  // namespace JNI_MotionEvent

#endif  // android_view_MotionEvent_JNI
