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 199d3b1a424c5c61e24e9659d15fb353026a00d925Jeff Brown#include <input/KeyCharacterMap.h> 209d3b1a424c5c61e24e9659d15fb353026a00d925Jeff Brown#include <input/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, 780c3f9210166a861fe568ac15994a0d7a42f7e28aAshok Bhat reinterpret_cast<jlong>(map)); 799f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown} 809f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown 810c3f9210166a861fe568ac15994a0d7a42f7e28aAshok Bhatstatic jlong 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); 980c3f9210166a861fe568ac15994a0d7a42f7e28aAshok Bhat return reinterpret_cast<jlong>(map); 999f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown} 1009f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown 1010c3f9210166a861fe568ac15994a0d7a42f7e28aAshok Bhatstatic void nativeWriteToParcel(JNIEnv* env, jobject clazz, jlong 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 1100c3f9210166a861fe568ac15994a0d7a42f7e28aAshok Bhatstatic void nativeDispose(JNIEnv *env, jobject clazz, jlong ptr) { 1119f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown NativeKeyCharacterMap* map = reinterpret_cast<NativeKeyCharacterMap*>(ptr); 1126b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown delete map; 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1150c3f9210166a861fe568ac15994a0d7a42f7e28aAshok Bhatstatic jchar nativeGetCharacter(JNIEnv *env, jobject clazz, jlong 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 1210c3f9210166a861fe568ac15994a0d7a42f7e28aAshok Bhatstatic jboolean nativeGetFallbackAction(JNIEnv *env, jobject clazz, jlong 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 1360c3f9210166a861fe568ac15994a0d7a42f7e28aAshok Bhatstatic jchar nativeGetNumber(JNIEnv *env, jobject clazz, jlong 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 1410c3f9210166a861fe568ac15994a0d7a42f7e28aAshok Bhatstatic jchar nativeGetMatch(JNIEnv *env, jobject clazz, jlong 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 1570c3f9210166a861fe568ac15994a0d7a42f7e28aAshok Bhatstatic jchar nativeGetDisplayLabel(JNIEnv *env, jobject clazz, jlong 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 1620c3f9210166a861fe568ac15994a0d7a42f7e28aAshok Bhatstatic jint nativeGetKeyboardType(JNIEnv *env, jobject clazz, jlong 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 1670c3f9210166a861fe568ac15994a0d7a42f7e28aAshok Bhatstatic jobjectArray nativeGetEvents(JNIEnv *env, jobject clazz, jlong 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 */ 2020c3f9210166a861fe568ac15994a0d7a42f7e28aAshok Bhat { "nativeReadFromParcel", "(Landroid/os/Parcel;)J", 2039f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown (void*)nativeReadFromParcel }, 2040c3f9210166a861fe568ac15994a0d7a42f7e28aAshok Bhat { "nativeWriteToParcel", "(JLandroid/os/Parcel;)V", 2059f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown (void*)nativeWriteToParcel }, 2060c3f9210166a861fe568ac15994a0d7a42f7e28aAshok Bhat { "nativeDispose", "(J)V", 2076b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown (void*)nativeDispose }, 2080c3f9210166a861fe568ac15994a0d7a42f7e28aAshok Bhat { "nativeGetCharacter", "(JII)C", 2096b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown (void*)nativeGetCharacter }, 2100c3f9210166a861fe568ac15994a0d7a42f7e28aAshok Bhat { "nativeGetFallbackAction", "(JIILandroid/view/KeyCharacterMap$FallbackAction;)Z", 21149ed71db425c5054e3ad9526496a7e116c89556bJeff Brown (void*)nativeGetFallbackAction }, 2120c3f9210166a861fe568ac15994a0d7a42f7e28aAshok Bhat { "nativeGetNumber", "(JI)C", 2136b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown (void*)nativeGetNumber }, 2140c3f9210166a861fe568ac15994a0d7a42f7e28aAshok Bhat { "nativeGetMatch", "(JI[CI)C", 2156b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown (void*)nativeGetMatch }, 2160c3f9210166a861fe568ac15994a0d7a42f7e28aAshok Bhat { "nativeGetDisplayLabel", "(JI)C", 2176b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown (void*)nativeGetDisplayLabel }, 2180c3f9210166a861fe568ac15994a0d7a42f7e28aAshok Bhat { "nativeGetKeyboardType", "(J)I", 2196b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown (void*)nativeGetKeyboardType }, 2200c3f9210166a861fe568ac15994a0d7a42f7e28aAshok Bhat { "nativeGetEvents", "(J[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, 2420c3f9210166a861fe568ac15994a0d7a42f7e28aAshok Bhat "<init>", "(J)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