Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何从Delphi访问KeyCharacterMap.getEvents函数返回的元素?_Android_Delphi_Delphi 10 Seattle - Fatal编程技术网

Android 如何从Delphi访问KeyCharacterMap.getEvents函数返回的元素?

Android 如何从Delphi访问KeyCharacterMap.getEvents函数返回的元素?,android,delphi,delphi-10-seattle,Android,Delphi,Delphi 10 Seattle,我试图使用Delphi中的JKeyCharacterMap.getEvents函数从字符中获取KeyCode 所以我用的是这个代码 uses FMX.Platform.Android, Androidapi.Helpers, Androidapi.JNIBridge; var s : string; PlatformKey : Word; FKeyCharacterMap: JKeyCharacterMap; events : TJavaObjectArray&l

我试图使用Delphi中的
JKeyCharacterMap.getEvents
函数从字符中获取KeyCode

所以我用的是这个代码

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;
GetJNIEnv
函数无法为
JNIEnvRes
变量赋值

class function TJNIResolver.GetJNIEnv: PJNIEnv;
begin
  if JNIEnvRes = nil then
    PJavaVM(System.JavaMachine)^.AttachCurrentThread(System.JavaMachine, @JNIEnvRes, nil);
  Result := JNIEnvRes;
end;

但我不知道是什么导致了这种行为。

在我的测试中,
GetJNIEnv
运行良好。虽然它似乎返回nil,但它是Delphi的调试器为
JNIEnvRes
显示了一个错误的值,正如您可以看到的那样,
Result
不是nil:

class function TJNIResolver.GetJNIEnv: PJNIEnv;
begin
  if JNIEnvRes = nil then
    PJavaVM(System.JavaMachine)^.AttachCurrentThread(System.JavaMachine, @JNIEnvRes, nil);
  Result := JNIEnvRes; 
  // debugger shows JNIEnvRes as nil and Result as not nil
end;
事实上,
GetObjectArrayElement
正在返回预期的对象,但由于
FClassID
nil
而导致失败的是随后的
WrapJNIReturn
<需要code>FClassID来创建具有适当类的包装器对象

WrapJNIReturn(AObject, FClassID, FBaseType.Handle, Result);

有两种方法可以解决此问题:

1.获取原始项并将其包装到具有正确类型的对象中 2.使用正确的ClassID将数组包装到一个数组中
events:=TJavaObjectArray.Wrap(FKeyCharacterMap.getEvents(chars));
l:=事件长度//这返回4
如果l>0,则
开始
事件:=事件[0];//现在运作良好
PlatformKey:=event.getKeyCode;
结束;

在失败函数的第一行上放置一个断点,并逐步遍历代码以确定哪一行引发错误。可能是您正在访问的数组不存在,至少在您检查它时是这样。谢谢您的提示,我刚刚更新了答案。
WrapJNIReturn(AObject, FClassID, FBaseType.Handle, Result);
events := FKeyCharacterMap.getEvents(chars);

l := events.Length; //this returns 4
if l>0 then
begin
  //event := events[0]; // Fails!
  event := TJKeyEvent.Wrap(events.GetRawItem(0)); // works
  PlatformKey := event.getKeyCode;
end;
events := TJavaObjectArray<JKeyEvent>.Wrap(FKeyCharacterMap.getEvents(chars));

l := events.Length; //this returns 4
if l>0 then
begin
  event := events[0]; // now working well
  PlatformKey := event.getKeyCode;
end;