The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 1 | /* |
| 2 | * Copyright 2006, The Android Open Source Project |
| 3 | * |
| 4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
| 5 | * you may not use this file except in compliance with the License. |
| 6 | * You may obtain a copy of the License at |
| 7 | * |
| 8 | * http://www.apache.org/licenses/LICENSE-2.0 |
| 9 | * |
| 10 | * Unless required by applicable law or agreed to in writing, software |
| 11 | * distributed under the License is distributed on an "AS IS" BASIS, |
| 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 13 | * See the License for the specific language governing permissions and |
| 14 | * limitations under the License. |
| 15 | */ |
| 16 | |
Jeff Brown | 9f25b7f | 2012-04-10 14:30:49 -0700 | [diff] [blame] | 17 | #include <android_runtime/AndroidRuntime.h> |
| 18 | |
Jeff Brown | 9d3b1a4 | 2013-07-01 19:07:15 -0700 | [diff] [blame] | 19 | #include <input/KeyCharacterMap.h> |
| 20 | #include <input/Input.h> |
Jeff Brown | 9f25b7f | 2012-04-10 14:30:49 -0700 | [diff] [blame] | 21 | #include <binder/Parcel.h> |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 22 | |
Jeff Brown | 6b53e8d | 2010-11-10 16:03:06 -0800 | [diff] [blame] | 23 | #include <nativehelper/jni.h> |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 24 | #include <nativehelper/JNIHelp.h> |
| 25 | |
Jeff Brown | 9f25b7f | 2012-04-10 14:30:49 -0700 | [diff] [blame] | 26 | #include "android_os_Parcel.h" |
Jeff Brown | 6b53e8d | 2010-11-10 16:03:06 -0800 | [diff] [blame] | 27 | #include "android_view_KeyEvent.h" |
| 28 | |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 29 | namespace android { |
| 30 | |
Jeff Brown | 6b53e8d | 2010-11-10 16:03:06 -0800 | [diff] [blame] | 31 | static struct { |
| 32 | jclass clazz; |
Jeff Brown | 9f25b7f | 2012-04-10 14:30:49 -0700 | [diff] [blame] | 33 | jmethodID ctor; |
| 34 | } gKeyCharacterMapClassInfo; |
| 35 | |
| 36 | static struct { |
| 37 | jclass clazz; |
Jeff Brown | 6b53e8d | 2010-11-10 16:03:06 -0800 | [diff] [blame] | 38 | } gKeyEventClassInfo; |
| 39 | |
Jeff Brown | 49ed71d | 2010-12-06 17:13:33 -0800 | [diff] [blame] | 40 | static struct { |
Jeff Brown | 49ed71d | 2010-12-06 17:13:33 -0800 | [diff] [blame] | 41 | jfieldID keyCode; |
| 42 | jfieldID metaState; |
| 43 | } gFallbackActionClassInfo; |
| 44 | |
| 45 | |
Jeff Brown | 9f25b7f | 2012-04-10 14:30:49 -0700 | [diff] [blame] | 46 | class NativeKeyCharacterMap { |
| 47 | public: |
| 48 | NativeKeyCharacterMap(int32_t deviceId, const sp<KeyCharacterMap>& map) : |
| 49 | mDeviceId(deviceId), mMap(map) { |
Jeff Brown | 6b53e8d | 2010-11-10 16:03:06 -0800 | [diff] [blame] | 50 | } |
Jeff Brown | 1e08fe9 | 2011-11-15 17:48:10 -0800 | [diff] [blame] | 51 | |
Jeff Brown | 9f25b7f | 2012-04-10 14:30:49 -0700 | [diff] [blame] | 52 | ~NativeKeyCharacterMap() { |
| 53 | } |
| 54 | |
| 55 | inline int32_t getDeviceId() const { |
| 56 | return mDeviceId; |
| 57 | } |
| 58 | |
| 59 | inline const sp<KeyCharacterMap>& getMap() const { |
| 60 | return mMap; |
| 61 | } |
| 62 | |
| 63 | private: |
| 64 | int32_t mDeviceId; |
| 65 | sp<KeyCharacterMap> mMap; |
| 66 | }; |
| 67 | |
| 68 | |
| 69 | jobject android_view_KeyCharacterMap_create(JNIEnv* env, int32_t deviceId, |
| 70 | const sp<KeyCharacterMap>& kcm) { |
| 71 | NativeKeyCharacterMap* map = new NativeKeyCharacterMap(deviceId, |
| 72 | kcm.get() ? kcm : KeyCharacterMap::empty()); |
| 73 | if (!map) { |
| 74 | return NULL; |
| 75 | } |
| 76 | |
| 77 | return env->NewObject(gKeyCharacterMapClassInfo.clazz, gKeyCharacterMapClassInfo.ctor, |
Ashok Bhat | 0c3f921 | 2014-01-08 14:15:02 +0000 | [diff] [blame] | 78 | reinterpret_cast<jlong>(map)); |
Jeff Brown | 9f25b7f | 2012-04-10 14:30:49 -0700 | [diff] [blame] | 79 | } |
| 80 | |
Ashok Bhat | 0c3f921 | 2014-01-08 14:15:02 +0000 | [diff] [blame] | 81 | static jlong nativeReadFromParcel(JNIEnv *env, jobject clazz, jobject parcelObj) { |
Jeff Brown | 9f25b7f | 2012-04-10 14:30:49 -0700 | [diff] [blame] | 82 | Parcel* parcel = parcelForJavaObject(env, parcelObj); |
| 83 | if (!parcel) { |
| 84 | return 0; |
| 85 | } |
| 86 | |
| 87 | int32_t deviceId = parcel->readInt32(); |
| 88 | if (parcel->errorCheck()) { |
| 89 | return 0; |
| 90 | } |
| 91 | |
| 92 | sp<KeyCharacterMap> kcm = KeyCharacterMap::readFromParcel(parcel); |
| 93 | if (!kcm.get()) { |
| 94 | return 0; |
| 95 | } |
| 96 | |
| 97 | NativeKeyCharacterMap* map = new NativeKeyCharacterMap(deviceId, kcm); |
Ashok Bhat | 0c3f921 | 2014-01-08 14:15:02 +0000 | [diff] [blame] | 98 | return reinterpret_cast<jlong>(map); |
Jeff Brown | 9f25b7f | 2012-04-10 14:30:49 -0700 | [diff] [blame] | 99 | } |
| 100 | |
Ashok Bhat | 0c3f921 | 2014-01-08 14:15:02 +0000 | [diff] [blame] | 101 | static void nativeWriteToParcel(JNIEnv* env, jobject clazz, jlong ptr, jobject parcelObj) { |
Jeff Brown | 9f25b7f | 2012-04-10 14:30:49 -0700 | [diff] [blame] | 102 | NativeKeyCharacterMap* map = reinterpret_cast<NativeKeyCharacterMap*>(ptr); |
| 103 | Parcel* parcel = parcelForJavaObject(env, parcelObj); |
| 104 | if (parcel) { |
| 105 | parcel->writeInt32(map->getDeviceId()); |
| 106 | map->getMap()->writeToParcel(parcel); |
| 107 | } |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 108 | } |
| 109 | |
Ashok Bhat | 0c3f921 | 2014-01-08 14:15:02 +0000 | [diff] [blame] | 110 | static void nativeDispose(JNIEnv *env, jobject clazz, jlong ptr) { |
Jeff Brown | 9f25b7f | 2012-04-10 14:30:49 -0700 | [diff] [blame] | 111 | NativeKeyCharacterMap* map = reinterpret_cast<NativeKeyCharacterMap*>(ptr); |
Jeff Brown | 6b53e8d | 2010-11-10 16:03:06 -0800 | [diff] [blame] | 112 | delete map; |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 113 | } |
| 114 | |
Ashok Bhat | 0c3f921 | 2014-01-08 14:15:02 +0000 | [diff] [blame] | 115 | static jchar nativeGetCharacter(JNIEnv *env, jobject clazz, jlong ptr, |
Jeff Brown | 6b53e8d | 2010-11-10 16:03:06 -0800 | [diff] [blame] | 116 | jint keyCode, jint metaState) { |
Jeff Brown | 9f25b7f | 2012-04-10 14:30:49 -0700 | [diff] [blame] | 117 | NativeKeyCharacterMap* map = reinterpret_cast<NativeKeyCharacterMap*>(ptr); |
| 118 | return map->getMap()->getCharacter(keyCode, metaState); |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 119 | } |
| 120 | |
Ashok Bhat | 0c3f921 | 2014-01-08 14:15:02 +0000 | [diff] [blame] | 121 | static jboolean nativeGetFallbackAction(JNIEnv *env, jobject clazz, jlong ptr, jint keyCode, |
Jeff Brown | 49ed71d | 2010-12-06 17:13:33 -0800 | [diff] [blame] | 122 | jint metaState, jobject fallbackActionObj) { |
Jeff Brown | 9f25b7f | 2012-04-10 14:30:49 -0700 | [diff] [blame] | 123 | NativeKeyCharacterMap* map = reinterpret_cast<NativeKeyCharacterMap*>(ptr); |
Jeff Brown | 49ed71d | 2010-12-06 17:13:33 -0800 | [diff] [blame] | 124 | KeyCharacterMap::FallbackAction fallbackAction; |
| 125 | |
Jeff Brown | 9f25b7f | 2012-04-10 14:30:49 -0700 | [diff] [blame] | 126 | bool result = map->getMap()->getFallbackAction(keyCode, metaState, &fallbackAction); |
Jeff Brown | 49ed71d | 2010-12-06 17:13:33 -0800 | [diff] [blame] | 127 | if (result) { |
| 128 | env->SetIntField(fallbackActionObj, gFallbackActionClassInfo.keyCode, |
| 129 | fallbackAction.keyCode); |
| 130 | env->SetIntField(fallbackActionObj, gFallbackActionClassInfo.metaState, |
| 131 | fallbackAction.metaState); |
| 132 | } |
| 133 | return result; |
| 134 | } |
| 135 | |
Ashok Bhat | 0c3f921 | 2014-01-08 14:15:02 +0000 | [diff] [blame] | 136 | static jchar nativeGetNumber(JNIEnv *env, jobject clazz, jlong ptr, jint keyCode) { |
Jeff Brown | 9f25b7f | 2012-04-10 14:30:49 -0700 | [diff] [blame] | 137 | NativeKeyCharacterMap* map = reinterpret_cast<NativeKeyCharacterMap*>(ptr); |
| 138 | return map->getMap()->getNumber(keyCode); |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 139 | } |
| 140 | |
Ashok Bhat | 0c3f921 | 2014-01-08 14:15:02 +0000 | [diff] [blame] | 141 | static jchar nativeGetMatch(JNIEnv *env, jobject clazz, jlong ptr, jint keyCode, |
Jeff Brown | 6b53e8d | 2010-11-10 16:03:06 -0800 | [diff] [blame] | 142 | jcharArray charsArray, jint metaState) { |
Jeff Brown | 9f25b7f | 2012-04-10 14:30:49 -0700 | [diff] [blame] | 143 | NativeKeyCharacterMap* map = reinterpret_cast<NativeKeyCharacterMap*>(ptr); |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 144 | |
Jeff Brown | 6b53e8d | 2010-11-10 16:03:06 -0800 | [diff] [blame] | 145 | jsize numChars = env->GetArrayLength(charsArray); |
| 146 | jchar* chars = static_cast<jchar*>(env->GetPrimitiveArrayCritical(charsArray, NULL)); |
| 147 | if (!chars) { |
| 148 | return 0; |
| 149 | } |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 150 | |
Jeff Brown | 9f25b7f | 2012-04-10 14:30:49 -0700 | [diff] [blame] | 151 | char16_t result = map->getMap()->getMatch(keyCode, chars, size_t(numChars), metaState); |
Jeff Brown | 6b53e8d | 2010-11-10 16:03:06 -0800 | [diff] [blame] | 152 | |
| 153 | env->ReleasePrimitiveArrayCritical(charsArray, chars, JNI_ABORT); |
| 154 | return result; |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 155 | } |
| 156 | |
Ashok Bhat | 0c3f921 | 2014-01-08 14:15:02 +0000 | [diff] [blame] | 157 | static jchar nativeGetDisplayLabel(JNIEnv *env, jobject clazz, jlong ptr, jint keyCode) { |
Jeff Brown | 9f25b7f | 2012-04-10 14:30:49 -0700 | [diff] [blame] | 158 | NativeKeyCharacterMap* map = reinterpret_cast<NativeKeyCharacterMap*>(ptr); |
| 159 | return map->getMap()->getDisplayLabel(keyCode); |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 160 | } |
| 161 | |
Ashok Bhat | 0c3f921 | 2014-01-08 14:15:02 +0000 | [diff] [blame] | 162 | static jint nativeGetKeyboardType(JNIEnv *env, jobject clazz, jlong ptr) { |
Jeff Brown | 9f25b7f | 2012-04-10 14:30:49 -0700 | [diff] [blame] | 163 | NativeKeyCharacterMap* map = reinterpret_cast<NativeKeyCharacterMap*>(ptr); |
| 164 | return map->getMap()->getKeyboardType(); |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 165 | } |
| 166 | |
Ashok Bhat | 0c3f921 | 2014-01-08 14:15:02 +0000 | [diff] [blame] | 167 | static jobjectArray nativeGetEvents(JNIEnv *env, jobject clazz, jlong ptr, |
Jeff Brown | 6b53e8d | 2010-11-10 16:03:06 -0800 | [diff] [blame] | 168 | jcharArray charsArray) { |
Jeff Brown | 9f25b7f | 2012-04-10 14:30:49 -0700 | [diff] [blame] | 169 | NativeKeyCharacterMap* map = reinterpret_cast<NativeKeyCharacterMap*>(ptr); |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 170 | |
Jeff Brown | 6b53e8d | 2010-11-10 16:03:06 -0800 | [diff] [blame] | 171 | jchar* chars = env->GetCharArrayElements(charsArray, NULL); |
| 172 | if (!chars) { |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 173 | return NULL; |
| 174 | } |
Jeff Brown | 6b53e8d | 2010-11-10 16:03:06 -0800 | [diff] [blame] | 175 | jsize numChars = env->GetArrayLength(charsArray); |
| 176 | |
| 177 | Vector<KeyEvent> events; |
| 178 | jobjectArray result = NULL; |
Jeff Brown | 9f25b7f | 2012-04-10 14:30:49 -0700 | [diff] [blame] | 179 | if (map->getMap()->getEvents(map->getDeviceId(), chars, size_t(numChars), events)) { |
Jeff Brown | 6b53e8d | 2010-11-10 16:03:06 -0800 | [diff] [blame] | 180 | result = env->NewObjectArray(jsize(events.size()), gKeyEventClassInfo.clazz, NULL); |
| 181 | if (result) { |
| 182 | for (size_t i = 0; i < events.size(); i++) { |
| 183 | jobject keyEventObj = android_view_KeyEvent_fromNative(env, &events.itemAt(i)); |
| 184 | if (!keyEventObj) break; // threw OOM exception |
| 185 | env->SetObjectArrayElement(result, jsize(i), keyEventObj); |
| 186 | env->DeleteLocalRef(keyEventObj); |
| 187 | } |
| 188 | } |
| 189 | } |
| 190 | |
| 191 | env->ReleaseCharArrayElements(charsArray, chars, JNI_ABORT); |
| 192 | return result; |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 193 | } |
| 194 | |
Jeff Brown | 6b53e8d | 2010-11-10 16:03:06 -0800 | [diff] [blame] | 195 | |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 196 | /* |
| 197 | * JNI registration. |
| 198 | */ |
| 199 | |
| 200 | static JNINativeMethod g_methods[] = { |
| 201 | /* name, signature, funcPtr */ |
Ashok Bhat | 0c3f921 | 2014-01-08 14:15:02 +0000 | [diff] [blame] | 202 | { "nativeReadFromParcel", "(Landroid/os/Parcel;)J", |
Jeff Brown | 9f25b7f | 2012-04-10 14:30:49 -0700 | [diff] [blame] | 203 | (void*)nativeReadFromParcel }, |
Ashok Bhat | 0c3f921 | 2014-01-08 14:15:02 +0000 | [diff] [blame] | 204 | { "nativeWriteToParcel", "(JLandroid/os/Parcel;)V", |
Jeff Brown | 9f25b7f | 2012-04-10 14:30:49 -0700 | [diff] [blame] | 205 | (void*)nativeWriteToParcel }, |
Ashok Bhat | 0c3f921 | 2014-01-08 14:15:02 +0000 | [diff] [blame] | 206 | { "nativeDispose", "(J)V", |
Jeff Brown | 6b53e8d | 2010-11-10 16:03:06 -0800 | [diff] [blame] | 207 | (void*)nativeDispose }, |
Ashok Bhat | 0c3f921 | 2014-01-08 14:15:02 +0000 | [diff] [blame] | 208 | { "nativeGetCharacter", "(JII)C", |
Jeff Brown | 6b53e8d | 2010-11-10 16:03:06 -0800 | [diff] [blame] | 209 | (void*)nativeGetCharacter }, |
Ashok Bhat | 0c3f921 | 2014-01-08 14:15:02 +0000 | [diff] [blame] | 210 | { "nativeGetFallbackAction", "(JIILandroid/view/KeyCharacterMap$FallbackAction;)Z", |
Jeff Brown | 49ed71d | 2010-12-06 17:13:33 -0800 | [diff] [blame] | 211 | (void*)nativeGetFallbackAction }, |
Ashok Bhat | 0c3f921 | 2014-01-08 14:15:02 +0000 | [diff] [blame] | 212 | { "nativeGetNumber", "(JI)C", |
Jeff Brown | 6b53e8d | 2010-11-10 16:03:06 -0800 | [diff] [blame] | 213 | (void*)nativeGetNumber }, |
Ashok Bhat | 0c3f921 | 2014-01-08 14:15:02 +0000 | [diff] [blame] | 214 | { "nativeGetMatch", "(JI[CI)C", |
Jeff Brown | 6b53e8d | 2010-11-10 16:03:06 -0800 | [diff] [blame] | 215 | (void*)nativeGetMatch }, |
Ashok Bhat | 0c3f921 | 2014-01-08 14:15:02 +0000 | [diff] [blame] | 216 | { "nativeGetDisplayLabel", "(JI)C", |
Jeff Brown | 6b53e8d | 2010-11-10 16:03:06 -0800 | [diff] [blame] | 217 | (void*)nativeGetDisplayLabel }, |
Ashok Bhat | 0c3f921 | 2014-01-08 14:15:02 +0000 | [diff] [blame] | 218 | { "nativeGetKeyboardType", "(J)I", |
Jeff Brown | 6b53e8d | 2010-11-10 16:03:06 -0800 | [diff] [blame] | 219 | (void*)nativeGetKeyboardType }, |
Ashok Bhat | 0c3f921 | 2014-01-08 14:15:02 +0000 | [diff] [blame] | 220 | { "nativeGetEvents", "(J[C)[Landroid/view/KeyEvent;", |
Jeff Brown | 6b53e8d | 2010-11-10 16:03:06 -0800 | [diff] [blame] | 221 | (void*)nativeGetEvents }, |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 222 | }; |
| 223 | |
Jeff Brown | 6b53e8d | 2010-11-10 16:03:06 -0800 | [diff] [blame] | 224 | #define FIND_CLASS(var, className) \ |
| 225 | var = env->FindClass(className); \ |
Carl Shapiro | 17cc33a | 2011-03-05 20:53:16 -0800 | [diff] [blame] | 226 | LOG_FATAL_IF(! var, "Unable to find class " className); |
Jeff Brown | 6b53e8d | 2010-11-10 16:03:06 -0800 | [diff] [blame] | 227 | |
Jeff Brown | 9f25b7f | 2012-04-10 14:30:49 -0700 | [diff] [blame] | 228 | #define GET_METHOD_ID(var, clazz, methodName, methodDescriptor) \ |
| 229 | var = env->GetMethodID(clazz, methodName, methodDescriptor); \ |
| 230 | LOG_FATAL_IF(! var, "Unable to find method " methodName); |
| 231 | |
Jeff Brown | 49ed71d | 2010-12-06 17:13:33 -0800 | [diff] [blame] | 232 | #define GET_FIELD_ID(var, clazz, fieldName, fieldDescriptor) \ |
| 233 | var = env->GetFieldID(clazz, fieldName, fieldDescriptor); \ |
| 234 | LOG_FATAL_IF(! var, "Unable to find field " fieldName); |
| 235 | |
Jeff Brown | 9f25b7f | 2012-04-10 14:30:49 -0700 | [diff] [blame] | 236 | int register_android_view_KeyCharacterMap(JNIEnv* env) |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 237 | { |
Jeff Brown | 9f25b7f | 2012-04-10 14:30:49 -0700 | [diff] [blame] | 238 | FIND_CLASS(gKeyCharacterMapClassInfo.clazz, "android/view/KeyCharacterMap"); |
| 239 | gKeyCharacterMapClassInfo.clazz = jclass(env->NewGlobalRef(gKeyCharacterMapClassInfo.clazz)); |
| 240 | |
| 241 | GET_METHOD_ID(gKeyCharacterMapClassInfo.ctor, gKeyCharacterMapClassInfo.clazz, |
Ashok Bhat | 0c3f921 | 2014-01-08 14:15:02 +0000 | [diff] [blame] | 242 | "<init>", "(J)V"); |
Jeff Brown | 9f25b7f | 2012-04-10 14:30:49 -0700 | [diff] [blame] | 243 | |
Jeff Brown | 6b53e8d | 2010-11-10 16:03:06 -0800 | [diff] [blame] | 244 | FIND_CLASS(gKeyEventClassInfo.clazz, "android/view/KeyEvent"); |
Carl Shapiro | 17cc33a | 2011-03-05 20:53:16 -0800 | [diff] [blame] | 245 | gKeyEventClassInfo.clazz = jclass(env->NewGlobalRef(gKeyEventClassInfo.clazz)); |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 246 | |
Carl Shapiro | 17cc33a | 2011-03-05 20:53:16 -0800 | [diff] [blame] | 247 | jclass clazz; |
| 248 | FIND_CLASS(clazz, "android/view/KeyCharacterMap$FallbackAction"); |
Jeff Brown | 49ed71d | 2010-12-06 17:13:33 -0800 | [diff] [blame] | 249 | |
Carl Shapiro | 17cc33a | 2011-03-05 20:53:16 -0800 | [diff] [blame] | 250 | GET_FIELD_ID(gFallbackActionClassInfo.keyCode, clazz, |
Jeff Brown | 49ed71d | 2010-12-06 17:13:33 -0800 | [diff] [blame] | 251 | "keyCode", "I"); |
| 252 | |
Carl Shapiro | 17cc33a | 2011-03-05 20:53:16 -0800 | [diff] [blame] | 253 | GET_FIELD_ID(gFallbackActionClassInfo.metaState, clazz, |
Jeff Brown | 49ed71d | 2010-12-06 17:13:33 -0800 | [diff] [blame] | 254 | "metaState", "I"); |
| 255 | |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 256 | return AndroidRuntime::registerNativeMethods(env, |
| 257 | "android/view/KeyCharacterMap", g_methods, NELEM(g_methods)); |
| 258 | } |
| 259 | |
| 260 | }; // namespace android |