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