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
29987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe#include "core_jni_helpers.h"
30987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android {
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
336b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brownstatic struct {
346b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown    jclass clazz;
359f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    jmethodID ctor;
369f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown} gKeyCharacterMapClassInfo;
379f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown
389f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brownstatic struct {
399f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    jclass clazz;
406b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown} gKeyEventClassInfo;
416b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown
4249ed71db425c5054e3ad9526496a7e116c89556bJeff Brownstatic struct {
4349ed71db425c5054e3ad9526496a7e116c89556bJeff Brown    jfieldID keyCode;
4449ed71db425c5054e3ad9526496a7e116c89556bJeff Brown    jfieldID metaState;
4549ed71db425c5054e3ad9526496a7e116c89556bJeff Brown} gFallbackActionClassInfo;
4649ed71db425c5054e3ad9526496a7e116c89556bJeff Brown
4749ed71db425c5054e3ad9526496a7e116c89556bJeff Brown
489f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brownclass NativeKeyCharacterMap {
499f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brownpublic:
509f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    NativeKeyCharacterMap(int32_t deviceId, const sp<KeyCharacterMap>& map) :
519f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mDeviceId(deviceId), mMap(map) {
526b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown    }
531e08fe90df18930691b0c2ec22e5db25d7fcb4cfJeff Brown
549f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    ~NativeKeyCharacterMap() {
559f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    }
569f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown
579f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    inline int32_t getDeviceId() const {
589f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        return mDeviceId;
599f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    }
609f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown
619f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    inline const sp<KeyCharacterMap>& getMap() const {
629f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        return mMap;
639f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    }
649f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown
659f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brownprivate:
669f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    int32_t mDeviceId;
679f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    sp<KeyCharacterMap> mMap;
689f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown};
699f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown
709f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown
719f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brownjobject android_view_KeyCharacterMap_create(JNIEnv* env, int32_t deviceId,
729f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        const sp<KeyCharacterMap>& kcm) {
739f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    NativeKeyCharacterMap* map = new NativeKeyCharacterMap(deviceId,
749f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown            kcm.get() ? kcm : KeyCharacterMap::empty());
759f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    if (!map) {
769f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        return NULL;
779f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    }
789f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown
799f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    return env->NewObject(gKeyCharacterMapClassInfo.clazz, gKeyCharacterMapClassInfo.ctor,
800c3f9210166a861fe568ac15994a0d7a42f7e28aAshok Bhat            reinterpret_cast<jlong>(map));
819f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown}
829f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown
830c3f9210166a861fe568ac15994a0d7a42f7e28aAshok Bhatstatic jlong nativeReadFromParcel(JNIEnv *env, jobject clazz, jobject parcelObj) {
849f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    Parcel* parcel = parcelForJavaObject(env, parcelObj);
859f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    if (!parcel) {
869f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        return 0;
879f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    }
889f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown
899f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    int32_t deviceId = parcel->readInt32();
909f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    if (parcel->errorCheck()) {
919f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        return 0;
929f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    }
939f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown
949f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    sp<KeyCharacterMap> kcm = KeyCharacterMap::readFromParcel(parcel);
959f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    if (!kcm.get()) {
969f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        return 0;
979f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    }
989f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown
999f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    NativeKeyCharacterMap* map = new NativeKeyCharacterMap(deviceId, kcm);
1000c3f9210166a861fe568ac15994a0d7a42f7e28aAshok Bhat    return reinterpret_cast<jlong>(map);
1019f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown}
1029f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown
1030c3f9210166a861fe568ac15994a0d7a42f7e28aAshok Bhatstatic void nativeWriteToParcel(JNIEnv* env, jobject clazz, jlong ptr, jobject parcelObj) {
1049f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    NativeKeyCharacterMap* map = reinterpret_cast<NativeKeyCharacterMap*>(ptr);
1059f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    Parcel* parcel = parcelForJavaObject(env, parcelObj);
1069f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    if (parcel) {
1079f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        parcel->writeInt32(map->getDeviceId());
1089f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        map->getMap()->writeToParcel(parcel);
1099f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    }
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1120c3f9210166a861fe568ac15994a0d7a42f7e28aAshok Bhatstatic void nativeDispose(JNIEnv *env, jobject clazz, jlong ptr) {
1139f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    NativeKeyCharacterMap* map = reinterpret_cast<NativeKeyCharacterMap*>(ptr);
1146b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown    delete map;
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1170c3f9210166a861fe568ac15994a0d7a42f7e28aAshok Bhatstatic jchar nativeGetCharacter(JNIEnv *env, jobject clazz, jlong ptr,
1186b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown        jint keyCode, jint metaState) {
1199f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    NativeKeyCharacterMap* map = reinterpret_cast<NativeKeyCharacterMap*>(ptr);
1209f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    return map->getMap()->getCharacter(keyCode, metaState);
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1230c3f9210166a861fe568ac15994a0d7a42f7e28aAshok Bhatstatic jboolean nativeGetFallbackAction(JNIEnv *env, jobject clazz, jlong ptr, jint keyCode,
12449ed71db425c5054e3ad9526496a7e116c89556bJeff Brown        jint metaState, jobject fallbackActionObj) {
1259f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    NativeKeyCharacterMap* map = reinterpret_cast<NativeKeyCharacterMap*>(ptr);
12649ed71db425c5054e3ad9526496a7e116c89556bJeff Brown    KeyCharacterMap::FallbackAction fallbackAction;
12749ed71db425c5054e3ad9526496a7e116c89556bJeff Brown
1289f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    bool result = map->getMap()->getFallbackAction(keyCode, metaState, &fallbackAction);
12949ed71db425c5054e3ad9526496a7e116c89556bJeff Brown    if (result) {
13049ed71db425c5054e3ad9526496a7e116c89556bJeff Brown        env->SetIntField(fallbackActionObj, gFallbackActionClassInfo.keyCode,
13149ed71db425c5054e3ad9526496a7e116c89556bJeff Brown                fallbackAction.keyCode);
13249ed71db425c5054e3ad9526496a7e116c89556bJeff Brown        env->SetIntField(fallbackActionObj, gFallbackActionClassInfo.metaState,
13349ed71db425c5054e3ad9526496a7e116c89556bJeff Brown                fallbackAction.metaState);
13449ed71db425c5054e3ad9526496a7e116c89556bJeff Brown    }
13549ed71db425c5054e3ad9526496a7e116c89556bJeff Brown    return result;
13649ed71db425c5054e3ad9526496a7e116c89556bJeff Brown}
13749ed71db425c5054e3ad9526496a7e116c89556bJeff Brown
1380c3f9210166a861fe568ac15994a0d7a42f7e28aAshok Bhatstatic jchar nativeGetNumber(JNIEnv *env, jobject clazz, jlong ptr, jint keyCode) {
1399f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    NativeKeyCharacterMap* map = reinterpret_cast<NativeKeyCharacterMap*>(ptr);
1409f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    return map->getMap()->getNumber(keyCode);
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1430c3f9210166a861fe568ac15994a0d7a42f7e28aAshok Bhatstatic jchar nativeGetMatch(JNIEnv *env, jobject clazz, jlong ptr, jint keyCode,
1446b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown        jcharArray charsArray, jint metaState) {
1459f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    NativeKeyCharacterMap* map = reinterpret_cast<NativeKeyCharacterMap*>(ptr);
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1476b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown    jsize numChars = env->GetArrayLength(charsArray);
1486b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown    jchar* chars = static_cast<jchar*>(env->GetPrimitiveArrayCritical(charsArray, NULL));
1496b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown    if (!chars) {
1506b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown        return 0;
1516b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown    }
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1536698749dd4d4d6513b26aa9071af290b956b68a7Dan Albert    char16_t result = map->getMap()->getMatch(
1546698749dd4d4d6513b26aa9071af290b956b68a7Dan Albert        keyCode, reinterpret_cast<char16_t*>(chars), size_t(numChars),
1556698749dd4d4d6513b26aa9071af290b956b68a7Dan Albert        metaState);
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1576b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown    env->ReleasePrimitiveArrayCritical(charsArray, chars, JNI_ABORT);
1586b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown    return result;
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1610c3f9210166a861fe568ac15994a0d7a42f7e28aAshok Bhatstatic jchar nativeGetDisplayLabel(JNIEnv *env, jobject clazz, jlong ptr, jint keyCode) {
1629f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    NativeKeyCharacterMap* map = reinterpret_cast<NativeKeyCharacterMap*>(ptr);
1639f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    return map->getMap()->getDisplayLabel(keyCode);
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1660c3f9210166a861fe568ac15994a0d7a42f7e28aAshok Bhatstatic jint nativeGetKeyboardType(JNIEnv *env, jobject clazz, jlong ptr) {
1679f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    NativeKeyCharacterMap* map = reinterpret_cast<NativeKeyCharacterMap*>(ptr);
1689f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    return map->getMap()->getKeyboardType();
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1710c3f9210166a861fe568ac15994a0d7a42f7e28aAshok Bhatstatic jobjectArray nativeGetEvents(JNIEnv *env, jobject clazz, jlong ptr,
1726b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown        jcharArray charsArray) {
1739f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    NativeKeyCharacterMap* map = reinterpret_cast<NativeKeyCharacterMap*>(ptr);
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1756b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown    jchar* chars = env->GetCharArrayElements(charsArray, NULL);
1766b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown    if (!chars) {
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NULL;
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1796b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown    jsize numChars = env->GetArrayLength(charsArray);
1806b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown
1816b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown    Vector<KeyEvent> events;
1826b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown    jobjectArray result = NULL;
1836698749dd4d4d6513b26aa9071af290b956b68a7Dan Albert    if (map->getMap()->getEvents(map->getDeviceId(),
1846698749dd4d4d6513b26aa9071af290b956b68a7Dan Albert                                 reinterpret_cast<char16_t*>(chars),
1856698749dd4d4d6513b26aa9071af290b956b68a7Dan Albert                                 size_t(numChars), events)) {
1866b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown        result = env->NewObjectArray(jsize(events.size()), gKeyEventClassInfo.clazz, NULL);
1876b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown        if (result) {
1886b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown            for (size_t i = 0; i < events.size(); i++) {
1896b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown                jobject keyEventObj = android_view_KeyEvent_fromNative(env, &events.itemAt(i));
1906b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown                if (!keyEventObj) break; // threw OOM exception
1916b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown                env->SetObjectArrayElement(result, jsize(i), keyEventObj);
1926b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown                env->DeleteLocalRef(keyEventObj);
1936b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown            }
1946b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown        }
1956b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown    }
1966b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown
1976b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown    env->ReleaseCharArrayElements(charsArray, chars, JNI_ABORT);
1986b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown    return result;
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2016b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * JNI registration.
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20676f6a86de25e1bf74717e047e55fd44b089673f3Daniel Micaystatic const JNINativeMethod g_methods[] = {
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* name, signature, funcPtr */
2080c3f9210166a861fe568ac15994a0d7a42f7e28aAshok Bhat    { "nativeReadFromParcel", "(Landroid/os/Parcel;)J",
2099f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown            (void*)nativeReadFromParcel },
2100c3f9210166a861fe568ac15994a0d7a42f7e28aAshok Bhat    { "nativeWriteToParcel", "(JLandroid/os/Parcel;)V",
2119f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown            (void*)nativeWriteToParcel },
2120c3f9210166a861fe568ac15994a0d7a42f7e28aAshok Bhat    { "nativeDispose", "(J)V",
2136b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown            (void*)nativeDispose },
2140c3f9210166a861fe568ac15994a0d7a42f7e28aAshok Bhat    { "nativeGetCharacter", "(JII)C",
2156b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown            (void*)nativeGetCharacter },
2160c3f9210166a861fe568ac15994a0d7a42f7e28aAshok Bhat    { "nativeGetFallbackAction", "(JIILandroid/view/KeyCharacterMap$FallbackAction;)Z",
21749ed71db425c5054e3ad9526496a7e116c89556bJeff Brown            (void*)nativeGetFallbackAction },
2180c3f9210166a861fe568ac15994a0d7a42f7e28aAshok Bhat    { "nativeGetNumber", "(JI)C",
2196b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown            (void*)nativeGetNumber },
2200c3f9210166a861fe568ac15994a0d7a42f7e28aAshok Bhat    { "nativeGetMatch", "(JI[CI)C",
2216b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown            (void*)nativeGetMatch },
2220c3f9210166a861fe568ac15994a0d7a42f7e28aAshok Bhat    { "nativeGetDisplayLabel", "(JI)C",
2236b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown            (void*)nativeGetDisplayLabel },
2240c3f9210166a861fe568ac15994a0d7a42f7e28aAshok Bhat    { "nativeGetKeyboardType", "(J)I",
2256b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown            (void*)nativeGetKeyboardType },
2260c3f9210166a861fe568ac15994a0d7a42f7e28aAshok Bhat    { "nativeGetEvents", "(J[C)[Landroid/view/KeyEvent;",
2276b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown            (void*)nativeGetEvents },
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2309f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brownint register_android_view_KeyCharacterMap(JNIEnv* env)
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
232987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    gKeyCharacterMapClassInfo.clazz = FindClassOrDie(env, "android/view/KeyCharacterMap");
233987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    gKeyCharacterMapClassInfo.clazz = MakeGlobalRefOrDie(env, gKeyCharacterMapClassInfo.clazz);
2349f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown
235987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    gKeyCharacterMapClassInfo.ctor = GetMethodIDOrDie(env, gKeyCharacterMapClassInfo.clazz,
2360c3f9210166a861fe568ac15994a0d7a42f7e28aAshok Bhat            "<init>", "(J)V");
2379f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown
238987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    gKeyEventClassInfo.clazz = FindClassOrDie(env, "android/view/KeyEvent");
239987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    gKeyEventClassInfo.clazz = MakeGlobalRefOrDie(env, gKeyEventClassInfo.clazz);
24049ed71db425c5054e3ad9526496a7e116c89556bJeff Brown
241987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    jclass clazz = FindClassOrDie(env, "android/view/KeyCharacterMap$FallbackAction");
24249ed71db425c5054e3ad9526496a7e116c89556bJeff Brown
243987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    gFallbackActionClassInfo.keyCode = GetFieldIDOrDie(env, clazz, "keyCode", "I");
244987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    gFallbackActionClassInfo.metaState = GetFieldIDOrDie(env, clazz, "metaState", "I");
24549ed71db425c5054e3ad9526496a7e116c89556bJeff Brown
246987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    return RegisterMethodsOrDie(env, "android/view/KeyCharacterMap", g_methods, NELEM(g_methods));
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android
250