接收完整的Andr​​oid单code输入在C / C ++ [英] Receive complete android unicode input in C/C++

查看:543
本文介绍了接收完整的Andr​​oid单code输入在C / C ++的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

(的Andr​​oid,NDK,C ++,OpenGL ES的)

(Android, NDK, C++, OpenGL ES)

我需要一种方法来从(软)键盘可靠地接收文本输入。
该解决方案可以使用NativeActivity的子类,或任何其工作原理是通过Java。
在我需要的任何文本正在键入,这样我就可以使我自己用OpenGL结束

I need a way to reliably receive the text input from a (soft)keyboard. The solution can be through Java using a NativeActivity subclass, or anything which works. At the end I need whatever text is being typed, so I can render it myself with OpenGL

一些背景资料:
到现在为止,我通过调用showSoftInput或hideSoftInputFromWindow认为JNI触发软键盘。这绝不到目前为止还没有。
然而,问题是本地活动将不发送所有字符。特别是一些单code字符的ASCII范围之外,或者一些运动软键盘将无法正常工作(AKeyEvent_getKey code)

Some background: Up until now I was triggering the soft keyboard by calling showSoftInput or hideSoftInputFromWindow thought JNI. This never failed so far. However, the problem is the native activity will not send all characters. Especially some unicode characters outside of ASCII range, or some motion soft keyboard won't work (AKeyEvent_getKeyCode)

它曾经是可能得到一些其他的UNI code字为什么检查KeyEvent.ACTION_MULTIPLE和读取字符的字符串。
但即使这样也不能可靠地工作了。

It used to be possible to get some of those other unicode characters why checking for KeyEvent.ACTION_MULTIPLE and reading a string of characters. But even this won't work reliably anymore.

到目前为止,我没有找到一种替代方法。
我尝试用编程方式添加的EditText,但从来没有得到它的工作。甚至试图添加一个简单的按钮导致OpenGL视图,不再被渲染。

So far I failed to find an alternative method. I experimented with programmatically adding a EditText, but never got it to work. Even trying to add a simple Button resulted in the OpenGL view to no longer being rendered.

在iOS上我的工作围绕它通过具有隐藏编辑框,我只是启动时,键盘显示出来。然后我会读出编辑框,并使用字符串来呈现自己在OpenGL。

On iOS I worked around it by having a hiding edit box, which I simply activated to make the keyboard show up. I would then read out the edit box and use the string to render myself in OpenGL.

推荐答案

我希望这对你的作品,为我工作至今。

I hope this works for you, worked for me so far.

int GetUnicodeChar(struct android_app* app, int eventType, int keyCode, int metaState)
{
JavaVM* javaVM = app->activity->vm;
JNIEnv* jniEnv = app->activity->env;

JavaVMAttachArgs attachArgs;
attachArgs.version = JNI_VERSION_1_6;
attachArgs.name = "NativeThread";
attachArgs.group = NULL;

jint result = javaVM->AttachCurrentThread(&jniEnv, &attachArgs);
if(result == JNI_ERR)
{
    return 0;
}

jclass class_key_event = jniEnv->FindClass("android/view/KeyEvent");
int unicodeKey;

if(metaState == 0)
{
    jmethodID method_get_unicode_char = jniEnv->GetMethodID(class_key_event, "getUnicodeChar", "()I");
    jmethodID eventConstructor = jniEnv->GetMethodID(class_key_event, "<init>", "(II)V");
    jobject eventObj = jniEnv->NewObject(class_key_event, eventConstructor, eventType, keyCode);

    unicodeKey = jniEnv->CallIntMethod(eventObj, method_get_unicode_char);
}

else
{
    jmethodID method_get_unicode_char = jniEnv->GetMethodID(class_key_event, "getUnicodeChar", "(I)I");
    jmethodID eventConstructor = jniEnv->GetMethodID(class_key_event, "<init>", "(II)V");
    jobject eventObj = jniEnv->NewObject(class_key_event, eventConstructor, eventType, keyCode);

    unicodeKey = jniEnv->CallIntMethod(eventObj, method_get_unicode_char, metaState);
}

javaVM->DetachCurrentThread();

LOGI("Unicode key is: %d", unicodeKey);
return unicodeKey;
}

刚刚从你的输入处理程序调用它,我的结构大致如下:

Just call it from your input handler, my structure is approximately as follows:

switch (AInputEvent_getType(event))
    {
        case AINPUT_EVENT_TYPE_KEY:
          switch (AKeyEvent_getAction(event))
          {
            case AKEY_EVENT_ACTION_DOWN:
              int key = AKeyEvent_getKeyCode(event);
              int metaState = AKeyEvent_getMetaState(event);
              int uniValue;
              if(metaState != 0)
                  uniValue = GetUnicodeChar(app, AKEY_EVENT_ACTION_DOWN, key, metaState);
              else
                  uniValue = GetUnicodeChar(app, AKEY_EVENT_ACTION_DOWN, key, 0);

既然你说你已经打开软键盘,我走不进的那部分,但code是一种直线前进。我基本上使用类的KeyEvent的Java函数有GetUni codeCHAR功能。

Since you stated that you already open the soft keyboard, I don't go into that part but the code is kind of straight forward. I basically use the Java function of class KeyEvent which has GetUnicodeChar function.

这篇关于接收完整的Andr​​oid单code输入在C / C ++的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆