Я пытаюсь использовать функцию JKeyCharacterMap.getEvents
из Delphi, чтобы получить KeyCode из Char.
Поэтому я использую этот код.
uses
FMX.Platform.Android,
Androidapi.Helpers,
Androidapi.JNIBridge;
var
s : string;
PlatformKey : Word;
FKeyCharacterMap: JKeyCharacterMap;
events : TJavaObjectArray<JKeyEvent>;
event : JKeyEvent;
chars: TJavaArray<Char>;
l : integer;
begin
FKeyCharacterMap := TJKeyCharacterMap.JavaClass.load(TJKeyCharacterMap.JavaClass.BUILT_IN_KEYBOARD);
chars := TJavaArray<Char>.Create(1);
chars[0] := 'A';
events := FKeyCharacterMap.getEvents(chars);
l := events.Length; //this returns 4
if l>0 then
begin
event := events[0]; // Segmentation fault (11)
PlatformKey := event.getKeyCode;
end;
end;
но, к сожалению, как только я пытаюсь получить доступ к некоторому элементу массива, возвращаемому функцией JKeyCharacterMap.getEvents
, я получаю исключение Segmentation fault (11)
.
Итак, вопрос в том, как я могу получить доступ к элементам, возвращаемым функцией KeyCharacterMap.getEvents из Delphi?
ОБНОВЛЕНИЕ
Я отлаживал, используя точку останова, когда возникает исключение, и приложение не работает с этой функцией Androidapi.JNIBridge.TJNIResolver.GetObjectArrayElement
, потому что переменная JNIEnvRes
равна нулю
class function TJNIResolver.GetObjectArrayElement(AArray: JNIObjectArray; Index: JNISize): JNIObject;
begin
GetJNIEnv;
//JNIEnvRes is nil
Result := JNIEnvRes^.GetObjectArrayElement(JNIEnvRes, AArray, Index);
end;
Функция GetJNIEnv
не может присвоить значение переменной JNIEnvRes
.
class function TJNIResolver.GetJNIEnv: PJNIEnv;
begin
if JNIEnvRes = nil then
PJavaVM(System.JavaMachine)^.AttachCurrentThread(System.JavaMachine, @JNIEnvRes, nil);
Result := JNIEnvRes;
end;
Но я не знаю, что вызывает такое поведение.