android_view_KeyEvent.cpp revision 3c80a4a044865bdf1289c7896baffa1c082d835c
146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown/* 246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * Copyright (C) 2010 The Android Open Source Project 346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * 446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * Licensed under the Apache License, Version 2.0 (the "License"); 546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * you may not use this file except in compliance with the License. 646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * You may obtain a copy of the License at 746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * 846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * http://www.apache.org/licenses/LICENSE-2.0 946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * 1046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * Unless required by applicable law or agreed to in writing, software 1146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * distributed under the License is distributed on an "AS IS" BASIS, 1246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * See the License for the specific language governing permissions and 1446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * limitations under the License. 1546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown */ 1646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 1746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#define LOG_TAG "KeyEvent-JNI" 1846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 1946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#include "JNIHelp.h" 2046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 2146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#include <android_runtime/AndroidRuntime.h> 2246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#include <utils/Log.h> 2346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#include <ui/Input.h> 2446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#include "android_view_KeyEvent.h" 2546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 2646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownnamespace android { 2746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 2846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown// ---------------------------------------------------------------------------- 2946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 3046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownstatic struct { 3146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown jclass clazz; 3246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 3346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown jmethodID ctor; 3446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 3546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown jfieldID mMetaState; 3646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown jfieldID mAction; 3746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown jfieldID mKeyCode; 3846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown jfieldID mScanCode; 3946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown jfieldID mRepeatCount; 4046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown jfieldID mDeviceId; 4146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown jfieldID mFlags; 4246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown jfieldID mDownTime; 4346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown jfieldID mEventTime; 4446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown jfieldID mCharacters; 4546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} gKeyEventClassInfo; 4646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 4746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown// ---------------------------------------------------------------------------- 4846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 4946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownjobject android_view_KeyEvent_fromNative(JNIEnv* env, const KeyEvent* event) { 5046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown return env->NewObject(gKeyEventClassInfo.clazz, gKeyEventClassInfo.ctor, 5146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown nanoseconds_to_milliseconds(event->getDownTime()), 5246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown nanoseconds_to_milliseconds(event->getEventTime()), 5346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown event->getAction(), 5446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown event->getKeyCode(), 5546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown event->getRepeatCount(), 5646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown event->getMetaState(), 5746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown event->getDeviceId(), 5846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown event->getScanCode(), 5946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown event->getFlags()); 6046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 6146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 6246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownvoid android_view_KeyEvent_toNative(JNIEnv* env, jobject eventObj, int32_t nature, 6346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown KeyEvent* event) { 6446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown jint metaState = env->GetIntField(eventObj, gKeyEventClassInfo.mMetaState); 6546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown jint action = env->GetIntField(eventObj, gKeyEventClassInfo.mAction); 6646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown jint keyCode = env->GetIntField(eventObj, gKeyEventClassInfo.mKeyCode); 6746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown jint scanCode = env->GetIntField(eventObj, gKeyEventClassInfo.mScanCode); 6846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown jint repeatCount = env->GetIntField(eventObj, gKeyEventClassInfo.mRepeatCount); 6946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown jint deviceId = env->GetIntField(eventObj, gKeyEventClassInfo.mDeviceId); 7046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown jint flags = env->GetIntField(eventObj, gKeyEventClassInfo.mFlags); 7146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown jlong downTime = env->GetLongField(eventObj, gKeyEventClassInfo.mDownTime); 7246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown jlong eventTime = env->GetLongField(eventObj, gKeyEventClassInfo.mEventTime); 7346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 7446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown event->initialize(deviceId, nature, action, flags, keyCode, scanCode, metaState, repeatCount, 7546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown milliseconds_to_nanoseconds(downTime), 7646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown milliseconds_to_nanoseconds(eventTime)); 7746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 7846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 793c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackbornstatic jboolean native_isSystemKey(JNIEnv* env, jobject clazz, jint keyCode) { 803c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn return KeyEvent::isSystemKey(keyCode); 813c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn} 823c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn 833c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackbornstatic jboolean native_hasDefaultAction(JNIEnv* env, jobject clazz, jint keyCode) { 843c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn return KeyEvent::hasDefaultAction(keyCode); 853c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn} 863c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn 8746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown// ---------------------------------------------------------------------------- 8846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 893c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackbornstatic const JNINativeMethod g_methods[] = { 903c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn { "native_isSystemKey", "(I)Z", (void*)native_isSystemKey }, 913c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn { "native_hasDefaultAction", "(I)Z", (void*)native_hasDefaultAction }, 923c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn}; 933c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn 943c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackbornstatic const char* const kKeyEventPathName = "android/view/KeyEvent"; 953c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn 9646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#define FIND_CLASS(var, className) \ 9746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown var = env->FindClass(className); \ 9846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown LOG_FATAL_IF(! var, "Unable to find class " className); \ 9946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown var = jclass(env->NewGlobalRef(var)); 10046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 10146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#define GET_METHOD_ID(var, clazz, methodName, fieldDescriptor) \ 10246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown var = env->GetMethodID(clazz, methodName, fieldDescriptor); \ 10346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown LOG_FATAL_IF(! var, "Unable to find method" methodName); 10446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 10546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#define GET_FIELD_ID(var, clazz, fieldName, fieldDescriptor) \ 10646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown var = env->GetFieldID(clazz, fieldName, fieldDescriptor); \ 10746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown LOG_FATAL_IF(! var, "Unable to find field " fieldName); 10846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 10946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownint register_android_view_KeyEvent(JNIEnv* env) { 1103c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn FIND_CLASS(gKeyEventClassInfo.clazz, kKeyEventPathName); 1113c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn 11246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown GET_METHOD_ID(gKeyEventClassInfo.ctor, gKeyEventClassInfo.clazz, 11346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown "<init>", "(JJIIIIIII)V"); 11446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 11546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown GET_FIELD_ID(gKeyEventClassInfo.mMetaState, gKeyEventClassInfo.clazz, 11646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown "mMetaState", "I"); 11746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown GET_FIELD_ID(gKeyEventClassInfo.mAction, gKeyEventClassInfo.clazz, 11846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown "mAction", "I"); 11946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown GET_FIELD_ID(gKeyEventClassInfo.mKeyCode, gKeyEventClassInfo.clazz, 12046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown "mKeyCode", "I"); 12146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown GET_FIELD_ID(gKeyEventClassInfo.mScanCode, gKeyEventClassInfo.clazz, 12246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown "mScanCode", "I"); 12346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown GET_FIELD_ID(gKeyEventClassInfo.mRepeatCount, gKeyEventClassInfo.clazz, 12446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown "mRepeatCount", "I"); 12546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown GET_FIELD_ID(gKeyEventClassInfo.mDeviceId, gKeyEventClassInfo.clazz, 12646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown "mDeviceId", "I"); 12746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown GET_FIELD_ID(gKeyEventClassInfo.mFlags, gKeyEventClassInfo.clazz, 12846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown "mFlags", "I"); 12946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown GET_FIELD_ID(gKeyEventClassInfo.mDownTime, gKeyEventClassInfo.clazz, 13046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown "mDownTime", "J"); 13146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown GET_FIELD_ID(gKeyEventClassInfo.mEventTime, gKeyEventClassInfo.clazz, 13246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown "mEventTime", "J"); 13346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown GET_FIELD_ID(gKeyEventClassInfo.mCharacters, gKeyEventClassInfo.clazz, 13446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown "mCharacters", "Ljava/lang/String;"); 13546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 1363c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn return AndroidRuntime::registerNativeMethods( 1373c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn env, kKeyEventPathName, 1383c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn g_methods, NELEM(g_methods)); 13946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 14046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 14146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} // namespace android 142