174 lines
5.2 KiB
C++
174 lines
5.2 KiB
C++
|
/*
|
||
|
* Copyright 2006, The Android Open Source Project
|
||
|
*
|
||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||
|
* you may not use this file except in compliance with the License.
|
||
|
* You may obtain a copy of the License at
|
||
|
*
|
||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||
|
*
|
||
|
* Unless required by applicable law or agreed to in writing, software
|
||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
|
* See the License for the specific language governing permissions and
|
||
|
* limitations under the License.
|
||
|
*/
|
||
|
|
||
|
#include <ui/KeyCharacterMap.h>
|
||
|
|
||
|
#include <nativehelper/jni.h>
|
||
|
#include <android_runtime/AndroidRuntime.h>
|
||
|
#include <nativehelper/JNIHelp.h>
|
||
|
|
||
|
namespace android {
|
||
|
|
||
|
static jint
|
||
|
ctor(JNIEnv *env, jobject clazz, jint id)
|
||
|
{
|
||
|
return reinterpret_cast<int>(KeyCharacterMap::load(id));
|
||
|
}
|
||
|
|
||
|
static void
|
||
|
dtor(JNIEnv *env, jobject clazz, jint ptr)
|
||
|
{
|
||
|
delete reinterpret_cast<KeyCharacterMap*>(ptr);
|
||
|
}
|
||
|
|
||
|
static jchar
|
||
|
get(JNIEnv *env, jobject clazz, jint ptr, jint keycode, jint meta)
|
||
|
{
|
||
|
return reinterpret_cast<KeyCharacterMap*>(ptr)->get(keycode, meta);
|
||
|
}
|
||
|
|
||
|
static jchar
|
||
|
getNumber(JNIEnv *env, jobject clazz, jint ptr, jint keycode)
|
||
|
{
|
||
|
return reinterpret_cast<KeyCharacterMap*>(ptr)->getNumber(keycode);
|
||
|
}
|
||
|
|
||
|
static jchar
|
||
|
getMatch(JNIEnv *env, jobject clazz, jint ptr, jint keycode, jcharArray chars, jint modifiers)
|
||
|
{
|
||
|
jchar rv;
|
||
|
jchar* ch = env->GetCharArrayElements(chars, NULL);
|
||
|
jsize chsize = env->GetArrayLength(chars);
|
||
|
|
||
|
rv = reinterpret_cast<KeyCharacterMap*>(ptr)->getMatch(keycode, ch, chsize, modifiers);
|
||
|
|
||
|
env->ReleaseCharArrayElements(chars, ch, JNI_ABORT);
|
||
|
return rv;
|
||
|
}
|
||
|
|
||
|
static jchar
|
||
|
getDisplayLabel(JNIEnv *env, jobject clazz, jint ptr, jint keycode)
|
||
|
{
|
||
|
return reinterpret_cast<KeyCharacterMap*>(ptr)->getDisplayLabel(keycode);
|
||
|
}
|
||
|
|
||
|
static jfieldID gKeyDataMetaField;
|
||
|
static jfieldID gKeyDataNumberField;
|
||
|
static jfieldID gKeyDataDisplayLabelField;
|
||
|
|
||
|
static jboolean
|
||
|
getKeyData(JNIEnv *env, jobject clazz, jint ptr, jint keycode, jobject keydata)
|
||
|
{
|
||
|
jboolean rv;
|
||
|
|
||
|
unsigned short displayLabel = env->GetCharField(keydata, gKeyDataDisplayLabelField);
|
||
|
unsigned short number = env->GetCharField(keydata, gKeyDataNumberField);
|
||
|
|
||
|
jcharArray chars = (jcharArray) env->GetObjectField(keydata, gKeyDataMetaField);
|
||
|
jchar* ch = env->GetCharArrayElements(chars, NULL);
|
||
|
|
||
|
KeyCharacterMap* kmap = reinterpret_cast<KeyCharacterMap*>(ptr);
|
||
|
rv = kmap->getKeyData(keycode, &displayLabel, &number, ch);
|
||
|
|
||
|
env->SetCharField(keydata, gKeyDataDisplayLabelField, displayLabel);
|
||
|
env->SetCharField(keydata, gKeyDataNumberField, number);
|
||
|
|
||
|
env->ReleaseCharArrayElements(chars, ch, 0);
|
||
|
return rv;
|
||
|
}
|
||
|
|
||
|
static jint
|
||
|
getKeyboardType(JNIEnv *env, jobject clazz, jint ptr)
|
||
|
{
|
||
|
return reinterpret_cast<KeyCharacterMap*>(ptr)->getKeyboardType();
|
||
|
}
|
||
|
|
||
|
static jlongArray
|
||
|
getEvents(JNIEnv *env, jobject clazz, jint ptr, jcharArray jchars)
|
||
|
{
|
||
|
KeyCharacterMap* kmap = reinterpret_cast<KeyCharacterMap*>(ptr);
|
||
|
|
||
|
uint16_t* chars = env->GetCharArrayElements(jchars, NULL);
|
||
|
size_t len = env->GetArrayLength(jchars);
|
||
|
|
||
|
Vector<int32_t> keys;
|
||
|
Vector<uint32_t> modifiers;
|
||
|
bool success = kmap->getEvents(chars, len, &keys, &modifiers);
|
||
|
|
||
|
env->ReleaseCharArrayElements(jchars, chars, JNI_ABORT);
|
||
|
|
||
|
if (success) {
|
||
|
size_t N = keys.size();
|
||
|
|
||
|
jlongArray rv = env->NewLongArray(N);
|
||
|
uint64_t* results = (uint64_t*)env->GetLongArrayElements(rv, NULL);
|
||
|
|
||
|
for (size_t i=0; i<N; i++) {
|
||
|
uint64_t v = modifiers[i];
|
||
|
v <<= 32;
|
||
|
v |= keys[i];
|
||
|
results[i] = v;
|
||
|
}
|
||
|
|
||
|
env->ReleaseLongArrayElements(rv, (jlong*)results, 0);
|
||
|
return rv;
|
||
|
} else {
|
||
|
return NULL;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// ============================================================================
|
||
|
/*
|
||
|
* JNI registration.
|
||
|
*/
|
||
|
|
||
|
static JNINativeMethod g_methods[] = {
|
||
|
/* name, signature, funcPtr */
|
||
|
{ "ctor_native", "(I)I", (void*)ctor },
|
||
|
{ "dtor_native", "(I)V", (void*)dtor },
|
||
|
{ "get_native", "(III)C", (void*)get },
|
||
|
{ "getNumber_native", "(II)C", (void*)getNumber },
|
||
|
{ "getMatch_native", "(II[CI)C", (void*)getMatch },
|
||
|
{ "getDisplayLabel_native", "(II)C", (void*)getDisplayLabel },
|
||
|
{ "getKeyData_native", "(IILandroid/view/KeyCharacterMap$KeyData;)Z",
|
||
|
(void*)getKeyData },
|
||
|
{ "getKeyboardType_native", "(I)I", (void*)getKeyboardType },
|
||
|
{ "getEvents_native", "(I[C)[J", (void*)getEvents }
|
||
|
};
|
||
|
|
||
|
int register_android_text_KeyCharacterMap(JNIEnv* env)
|
||
|
{
|
||
|
jclass clazz;
|
||
|
|
||
|
clazz = env->FindClass("android/view/KeyCharacterMap$KeyData");
|
||
|
if (clazz == NULL) {
|
||
|
LOGE("Can't find android/view/KeyCharacterMap$KeyData");
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
gKeyDataMetaField = env->GetFieldID(clazz, "meta", "[C");
|
||
|
gKeyDataNumberField = env->GetFieldID(clazz, "number", "C");
|
||
|
gKeyDataDisplayLabelField = env->GetFieldID(clazz, "displayLabel", "C");
|
||
|
|
||
|
return AndroidRuntime::registerNativeMethods(env,
|
||
|
"android/view/KeyCharacterMap", g_methods, NELEM(g_methods));
|
||
|
}
|
||
|
|
||
|
}; // namespace android
|
||
|
|
||
|
|
||
|
|