19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright 2006, The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project*/ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown#include <android_runtime/AndroidRuntime.h> 189f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown 19b93a03f841d93498bfea6cc92a22faa34bce1337Mathias Agopian#include <androidfw/KeyCharacterMap.h> 20b93a03f841d93498bfea6cc92a22faa34bce1337Mathias Agopian#include <androidfw/Input.h> 219f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown#include <binder/Parcel.h> 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 236b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown#include <nativehelper/jni.h> 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <nativehelper/JNIHelp.h> 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 269f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown#include "android_os_Parcel.h" 276b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown#include "android_view_KeyEvent.h" 286b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android { 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 316b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brownstatic struct { 326b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown jclass clazz; 339f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown jmethodID ctor; 349f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown} gKeyCharacterMapClassInfo; 359f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown 369f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brownstatic struct { 379f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown jclass clazz; 386b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown} gKeyEventClassInfo; 396b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown 4049ed71db425c5054e3ad9526496a7e116c89556bJeff Brownstatic struct { 4149ed71db425c5054e3ad9526496a7e116c89556bJeff Brown jfieldID keyCode; 4249ed71db425c5054e3ad9526496a7e116c89556bJeff Brown jfieldID metaState; 4349ed71db425c5054e3ad9526496a7e116c89556bJeff Brown} gFallbackActionClassInfo; 4449ed71db425c5054e3ad9526496a7e116c89556bJeff Brown 4549ed71db425c5054e3ad9526496a7e116c89556bJeff Brown 469f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brownclass NativeKeyCharacterMap { 479f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brownpublic: 489f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown NativeKeyCharacterMap(int32_t deviceId, const sp<KeyCharacterMap>& map) : 499f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown mDeviceId(deviceId), mMap(map) { 506b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown } 511e08fe90df18930691b0c2ec22e5db25d7fcb4cfJeff Brown 529f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown ~NativeKeyCharacterMap() { 539f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown } 549f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown 559f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown inline int32_t getDeviceId() const { 569f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown return mDeviceId; 579f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown } 589f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown 599f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown inline const sp<KeyCharacterMap>& getMap() const { 609f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown return mMap; 619f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown } 629f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown 639f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brownprivate: 649f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown int32_t mDeviceId; 659f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown sp<KeyCharacterMap> mMap; 669f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown}; 679f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown 689f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown 699f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brownjobject android_view_KeyCharacterMap_create(JNIEnv* env, int32_t deviceId, 709f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown const sp<KeyCharacterMap>& kcm) { 719f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown NativeKeyCharacterMap* map = new NativeKeyCharacterMap(deviceId, 729f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown kcm.get() ? kcm : KeyCharacterMap::empty()); 739f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown if (!map) { 749f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown return NULL; 759f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown } 769f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown 779f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown return env->NewObject(gKeyCharacterMapClassInfo.clazz, gKeyCharacterMapClassInfo.ctor, 789f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown reinterpret_cast<jint>(map)); 799f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown} 809f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown 819f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brownstatic jint nativeReadFromParcel(JNIEnv *env, jobject clazz, jobject parcelObj) { 829f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown Parcel* parcel = parcelForJavaObject(env, parcelObj); 839f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown if (!parcel) { 849f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown return 0; 859f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown } 869f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown 879f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown int32_t deviceId = parcel->readInt32(); 889f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown if (parcel->errorCheck()) { 899f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown return 0; 909f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown } 919f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown 929f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown sp<KeyCharacterMap> kcm = KeyCharacterMap::readFromParcel(parcel); 939f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown if (!kcm.get()) { 949f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown return 0; 959f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown } 969f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown 979f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown NativeKeyCharacterMap* map = new NativeKeyCharacterMap(deviceId, kcm); 989f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown return reinterpret_cast<jint>(map); 999f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown} 1009f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown 1019f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brownstatic void nativeWriteToParcel(JNIEnv* env, jobject clazz, jint ptr, jobject parcelObj) { 1029f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown NativeKeyCharacterMap* map = reinterpret_cast<NativeKeyCharacterMap*>(ptr); 1039f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown Parcel* parcel = parcelForJavaObject(env, parcelObj); 1049f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown if (parcel) { 1059f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown parcel->writeInt32(map->getDeviceId()); 1069f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown map->getMap()->writeToParcel(parcel); 1079f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown } 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1106b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brownstatic void nativeDispose(JNIEnv *env, jobject clazz, jint ptr) { 1119f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown NativeKeyCharacterMap* map = reinterpret_cast<NativeKeyCharacterMap*>(ptr); 1126b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown delete map; 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1156b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brownstatic jchar nativeGetCharacter(JNIEnv *env, jobject clazz, jint ptr, 1166b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown jint keyCode, jint metaState) { 1179f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown NativeKeyCharacterMap* map = reinterpret_cast<NativeKeyCharacterMap*>(ptr); 1189f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown return map->getMap()->getCharacter(keyCode, metaState); 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12149ed71db425c5054e3ad9526496a7e116c89556bJeff Brownstatic jboolean nativeGetFallbackAction(JNIEnv *env, jobject clazz, jint ptr, jint keyCode, 12249ed71db425c5054e3ad9526496a7e116c89556bJeff Brown jint metaState, jobject fallbackActionObj) { 1239f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown NativeKeyCharacterMap* map = reinterpret_cast<NativeKeyCharacterMap*>(ptr); 12449ed71db425c5054e3ad9526496a7e116c89556bJeff Brown KeyCharacterMap::FallbackAction fallbackAction; 12549ed71db425c5054e3ad9526496a7e116c89556bJeff Brown 1269f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown bool result = map->getMap()->getFallbackAction(keyCode, metaState, &fallbackAction); 12749ed71db425c5054e3ad9526496a7e116c89556bJeff Brown if (result) { 12849ed71db425c5054e3ad9526496a7e116c89556bJeff Brown env->SetIntField(fallbackActionObj, gFallbackActionClassInfo.keyCode, 12949ed71db425c5054e3ad9526496a7e116c89556bJeff Brown fallbackAction.keyCode); 13049ed71db425c5054e3ad9526496a7e116c89556bJeff Brown env->SetIntField(fallbackActionObj, gFallbackActionClassInfo.metaState, 13149ed71db425c5054e3ad9526496a7e116c89556bJeff Brown fallbackAction.metaState); 13249ed71db425c5054e3ad9526496a7e116c89556bJeff Brown } 13349ed71db425c5054e3ad9526496a7e116c89556bJeff Brown return result; 13449ed71db425c5054e3ad9526496a7e116c89556bJeff Brown} 13549ed71db425c5054e3ad9526496a7e116c89556bJeff Brown 1366b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brownstatic jchar nativeGetNumber(JNIEnv *env, jobject clazz, jint ptr, jint keyCode) { 1379f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown NativeKeyCharacterMap* map = reinterpret_cast<NativeKeyCharacterMap*>(ptr); 1389f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown return map->getMap()->getNumber(keyCode); 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1416b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brownstatic jchar nativeGetMatch(JNIEnv *env, jobject clazz, jint ptr, jint keyCode, 1426b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown jcharArray charsArray, jint metaState) { 1439f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown NativeKeyCharacterMap* map = reinterpret_cast<NativeKeyCharacterMap*>(ptr); 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1456b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown jsize numChars = env->GetArrayLength(charsArray); 1466b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown jchar* chars = static_cast<jchar*>(env->GetPrimitiveArrayCritical(charsArray, NULL)); 1476b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown if (!chars) { 1486b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown return 0; 1496b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown } 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1519f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown char16_t result = map->getMap()->getMatch(keyCode, chars, size_t(numChars), metaState); 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1536b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown env->ReleasePrimitiveArrayCritical(charsArray, chars, JNI_ABORT); 1546b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown return result; 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1576b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brownstatic jchar nativeGetDisplayLabel(JNIEnv *env, jobject clazz, jint ptr, jint keyCode) { 1589f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown NativeKeyCharacterMap* map = reinterpret_cast<NativeKeyCharacterMap*>(ptr); 1599f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown return map->getMap()->getDisplayLabel(keyCode); 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1626b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brownstatic jint nativeGetKeyboardType(JNIEnv *env, jobject clazz, jint ptr) { 1639f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown NativeKeyCharacterMap* map = reinterpret_cast<NativeKeyCharacterMap*>(ptr); 1649f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown return map->getMap()->getKeyboardType(); 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1679f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brownstatic jobjectArray nativeGetEvents(JNIEnv *env, jobject clazz, jint ptr, 1686b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown jcharArray charsArray) { 1699f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown NativeKeyCharacterMap* map = reinterpret_cast<NativeKeyCharacterMap*>(ptr); 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1716b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown jchar* chars = env->GetCharArrayElements(charsArray, NULL); 1726b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown if (!chars) { 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1756b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown jsize numChars = env->GetArrayLength(charsArray); 1766b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown 1776b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown Vector<KeyEvent> events; 1786b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown jobjectArray result = NULL; 1799f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown if (map->getMap()->getEvents(map->getDeviceId(), chars, size_t(numChars), events)) { 1806b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown result = env->NewObjectArray(jsize(events.size()), gKeyEventClassInfo.clazz, NULL); 1816b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown if (result) { 1826b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown for (size_t i = 0; i < events.size(); i++) { 1836b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown jobject keyEventObj = android_view_KeyEvent_fromNative(env, &events.itemAt(i)); 1846b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown if (!keyEventObj) break; // threw OOM exception 1856b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown env->SetObjectArrayElement(result, jsize(i), keyEventObj); 1866b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown env->DeleteLocalRef(keyEventObj); 1876b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown } 1886b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown } 1896b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown } 1906b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown 1916b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown env->ReleaseCharArrayElements(charsArray, chars, JNI_ABORT); 1926b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown return result; 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1956b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * JNI registration. 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod g_methods[] = { 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* name, signature, funcPtr */ 2029f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown { "nativeReadFromParcel", "(Landroid/os/Parcel;)I", 2039f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown (void*)nativeReadFromParcel }, 2049f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown { "nativeWriteToParcel", "(ILandroid/os/Parcel;)V", 2059f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown (void*)nativeWriteToParcel }, 2066b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown { "nativeDispose", "(I)V", 2076b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown (void*)nativeDispose }, 2086b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown { "nativeGetCharacter", "(III)C", 2096b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown (void*)nativeGetCharacter }, 21049ed71db425c5054e3ad9526496a7e116c89556bJeff Brown { "nativeGetFallbackAction", "(IIILandroid/view/KeyCharacterMap$FallbackAction;)Z", 21149ed71db425c5054e3ad9526496a7e116c89556bJeff Brown (void*)nativeGetFallbackAction }, 2126b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown { "nativeGetNumber", "(II)C", 2136b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown (void*)nativeGetNumber }, 2146b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown { "nativeGetMatch", "(II[CI)C", 2156b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown (void*)nativeGetMatch }, 2166b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown { "nativeGetDisplayLabel", "(II)C", 2176b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown (void*)nativeGetDisplayLabel }, 2186b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown { "nativeGetKeyboardType", "(I)I", 2196b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown (void*)nativeGetKeyboardType }, 2209f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown { "nativeGetEvents", "(I[C)[Landroid/view/KeyEvent;", 2216b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown (void*)nativeGetEvents }, 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2246b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown#define FIND_CLASS(var, className) \ 2256b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown var = env->FindClass(className); \ 22617cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro LOG_FATAL_IF(! var, "Unable to find class " className); 2276b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown 2289f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown#define GET_METHOD_ID(var, clazz, methodName, methodDescriptor) \ 2299f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown var = env->GetMethodID(clazz, methodName, methodDescriptor); \ 2309f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown LOG_FATAL_IF(! var, "Unable to find method " methodName); 2319f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown 23249ed71db425c5054e3ad9526496a7e116c89556bJeff Brown#define GET_FIELD_ID(var, clazz, fieldName, fieldDescriptor) \ 23349ed71db425c5054e3ad9526496a7e116c89556bJeff Brown var = env->GetFieldID(clazz, fieldName, fieldDescriptor); \ 23449ed71db425c5054e3ad9526496a7e116c89556bJeff Brown LOG_FATAL_IF(! var, "Unable to find field " fieldName); 23549ed71db425c5054e3ad9526496a7e116c89556bJeff Brown 2369f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brownint register_android_view_KeyCharacterMap(JNIEnv* env) 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2389f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown FIND_CLASS(gKeyCharacterMapClassInfo.clazz, "android/view/KeyCharacterMap"); 2399f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown gKeyCharacterMapClassInfo.clazz = jclass(env->NewGlobalRef(gKeyCharacterMapClassInfo.clazz)); 2409f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown 2419f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown GET_METHOD_ID(gKeyCharacterMapClassInfo.ctor, gKeyCharacterMapClassInfo.clazz, 2429f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown "<init>", "(I)V"); 2439f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown 2446b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown FIND_CLASS(gKeyEventClassInfo.clazz, "android/view/KeyEvent"); 24517cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro gKeyEventClassInfo.clazz = jclass(env->NewGlobalRef(gKeyEventClassInfo.clazz)); 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24717cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro jclass clazz; 24817cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro FIND_CLASS(clazz, "android/view/KeyCharacterMap$FallbackAction"); 24949ed71db425c5054e3ad9526496a7e116c89556bJeff Brown 25017cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro GET_FIELD_ID(gFallbackActionClassInfo.keyCode, clazz, 25149ed71db425c5054e3ad9526496a7e116c89556bJeff Brown "keyCode", "I"); 25249ed71db425c5054e3ad9526496a7e116c89556bJeff Brown 25317cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro GET_FIELD_ID(gFallbackActionClassInfo.metaState, clazz, 25449ed71db425c5054e3ad9526496a7e116c89556bJeff Brown "metaState", "I"); 25549ed71db425c5054e3ad9526496a7e116c89556bJeff Brown 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return AndroidRuntime::registerNativeMethods(env, 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "android/view/KeyCharacterMap", g_methods, NELEM(g_methods)); 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android 261