1) what is the api you're using the get the key?
The key characters are given to you in an event; you don't need key translation stables... (for isntance select russian as your keyboard input, they still give the same keycodes, but there is a key value)
engine->key_text = AndroidGetKeyText( event );
err I guess that's my own JNI method from somewhere...
------------
extern "C" int AndroidGetKeyText( AInputEvent *event )
{
int result = 0;
// Attaches the current thread to the JVM.
jint lResult;
jint lFlags = 0;
JavaVM* lJavaVM = engine.app->activity->vm;
JNIEnv* lJNIEnv = engine.app->activity->env;
JavaVMAttachArgs lJavaVMAttachArgs;
lJavaVMAttachArgs.version = JNI_VERSION_1_6;
lJavaVMAttachArgs.name = "NativeThread";
lJavaVMAttachArgs.group = NULL;
lResult=lJavaVM->AttachCurrentThread(&lJNIEnv, &lJavaVMAttachArgs);
if (lResult == JNI_ERR) {
return 0;
}
// Retrieves NativeActivity.
jobject lNativeActivity = engine.app->activity->clazz;
jclass ClassNativeActivity = lJNIEnv->GetObjectClass(lNativeActivity);
jmethodID MethodSetFlags = lJNIEnv->GetMethodID( ClassNativeActivity, "getKeyText", "(JJIIIIIII)I");
lprintf( "..." );
if( MethodSetFlags )
result = lJNIEnv->CallIntMethod( lNativeActivity, MethodSetFlags
, AKeyEvent_getDownTime(event)
, AKeyEvent_getEventTime(event)
, AKeyEvent_getAction(event)
, AKeyEvent_getKeyCode(event)
, AKeyEvent_getRepeatCount(event)
, AKeyEvent_getMetaState(event)
, AInputEvent_getDeviceId(event)
, AKeyEvent_getScanCode(event)
, AKeyEvent_getFlags(event)
);
else
{
lprintf( "Failed to get method." );
result = 0;
}
// Finished with the JVM.
lJavaVM->DetachCurrentThread();
return result;
}
--------
The java code..
int prior_key;
public int getKeyText (long downTime, long eventTime, int action, int code, int repeat, int metaState, int deviceId, int scancode, int flags, int source) {
KeyEvent key;
Log.v( "org.d3x0r.sack.mynative", "got to having a key...." );
key = new KeyEvent( downTime, eventTime, action, code, repeat, metaState, deviceId, scancode, flags, source );
int result = key.getUnicodeChar();
Log.v( "org.d3x0r.sack.karway.mynative", "key immediate result is " + result );
String s_result = key.getCharacters();
Log.v( "org.d3x0r.sack.mynative", "key immediate result is " + s_result );
if( ( result & KeyCharacterMap.COMBINING_ACCENT ) != 0 )
{
prior_key = result & KeyCharacterMap.COMBINING_ACCENT_MASK;
Log.v( "org.d3x0r.sack.mynative", "keeping key until next" );
result = 0;
}
else
{
Log.v( "org.d3x0r.sack.mynative", "prior is " + prior_key );
if( prior_key != 0 )
{
result = KeyCharacterMap.getDeadChar( prior_key, result );
prior_key = 0;
}
}
return result;
}
-----------
but that didn't help for international methods.
Some several NDK versions ago (maybe from 10?)
NativeActivity supports OnKeyDown
public boolean onKeyDown(int keyCode, KeyEvent event)
{
Log.d( "MyNativeActivity", "Key down event!" + event.getUnicodeChar() );
int keymod = event.getMetaState();
keymod = ( ( keymod & ( KeyEvent.META_SHIFT_RIGHT_ON | KeyEvent.META_SHIFT_LEFT_ON | KeyEvent.META_SHIFT_ON ) ) != 0 ? 1 : 0 )
| ( ( keymod & ( KeyEvent.META_CTRL_RIGHT_ON | KeyEvent.META_CTRL_LEFT_ON | KeyEvent.META_CTRL_ON ) ) != 0 ? 2 : 0 )
| ( ( keymod & ( KeyEvent.META_ALT_RIGHT_ON | KeyEvent.META_ALT_LEFT_ON | KeyEvent.META_ALT_ON ) ) != 0 ? 4 : 0 );
String chars = String.valueOf((char)event.getUnicodeChar());
NativeStaticLib.sendKeyEvent( 1, event.getKeyCode(), event.getScanCode(), keymod, chars );
return true;
}
which really boils down to just
public boolean onKeyDown(int keyCode, KeyEvent event)
{
String chars = String.valueOf((char)event.getUnicodeChar());
// post string as keybaord input
This will even return macro keys like '.com' or ':-)'
but then you don't get the keys in the normal native activity pipes....
AKeyEvent_getKeyCode fails for unicode characters in C++ code side...