mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-28 22:20:25 +02:00
Fixes crashes in the emulator related to invalid JNI references: in the combobox dialog and menu
git-svn-id: trunk@36400 -
This commit is contained in:
parent
9e6f83df53
commit
09b5be1b02
@ -288,18 +288,28 @@ var
|
|||||||
lJavaString: JString;
|
lJavaString: JString;
|
||||||
i: Integer;
|
i: Integer;
|
||||||
begin
|
begin
|
||||||
//__android_log_write(ANDROID_LOG_INFO, 'lclapp', '[TCDWidgetset.ShowSelectItemDialog]');
|
//{$define VerboseCDShowSelectItemDialog}
|
||||||
|
{$ifdef VerboseCDShowSelectItemDialog}
|
||||||
|
DebugLn(Format('[TCDWidgetset.ShowSelectItemDialog] javaEnvRef=%x', [PtrUInt(javaEnvRef)]));
|
||||||
|
{$endif}
|
||||||
|
|
||||||
// First get the classes
|
// First get the classes
|
||||||
javaAndroidAppAlertDialogBuilderClass := javaEnvRef^^.FindClass(javaEnvRef, 'android/app/AlertDialog$Builder');
|
javaAndroidAppAlertDialogBuilderClass := javaEnvRef^^.FindClass(javaEnvRef, 'android/app/AlertDialog$Builder');
|
||||||
javaCharSequence := javaEnvRef^^.FindClass(javaEnvRef, 'java/lang/String');//'java/lang/CharSequence');
|
javaCharSequence := javaEnvRef^^.FindClass(javaEnvRef, 'java/lang/String');//'java/lang/CharSequence');
|
||||||
//__android_log_write(ANDROID_LOG_INFO, 'lclapp', PChar('[TCDWidgetset.ShowSelectItemDialog] 2 javaAndroidAppAlertDialogBuilderClass='+IntToStr(PtrInt(javaAndroidAppAlertDialogBuilderClass))));
|
{$ifdef VerboseCDShowSelectItemDialog}
|
||||||
|
DebugLn('[TCDWidgetset.ShowSelectItemDialog] 2 javaAndroidAppAlertDialogBuilderClass='+IntToStr(PtrInt(javaAndroidAppAlertDialogBuilderClass)));
|
||||||
|
{$endif}
|
||||||
|
|
||||||
// final AlertDialog.Builder ad = new AlertDialog.Builder(this);
|
// final AlertDialog.Builder ad = new AlertDialog.Builder(this);
|
||||||
javaMethod_AlertDialogBuilder_new := javaEnvRef^^.GetMethodID(javaEnvRef, javaAndroidAppAlertDialogBuilderClass, '<init>', '(Landroid/content/Context;)V');
|
javaMethod_AlertDialogBuilder_new := javaEnvRef^^.GetMethodID(javaEnvRef, javaAndroidAppAlertDialogBuilderClass, '<init>', '(Landroid/content/Context;)V');
|
||||||
lParams[0].l := javaActivityObject;
|
lParams[0].l := javaActivityObject;
|
||||||
javaAlertDialog := javaEnvRef^^.NewObjectA(javaEnvRef, javaAndroidAppAlertDialogBuilderClass, javaMethod_AlertDialogBuilder_new, @lParams[0]);
|
javaAlertDialog := javaEnvRef^^.NewObjectA(javaEnvRef, javaAndroidAppAlertDialogBuilderClass, javaMethod_AlertDialogBuilder_new, @lParams[0]);
|
||||||
//__android_log_write(ANDROID_LOG_INFO, 'lclapp', '[TCDWidgetset.ShowSelectItemDialog] 3');
|
{$ifdef VerboseCDShowSelectItemDialog}
|
||||||
|
DebugLn(Format('[TCDWidgetset.ShowSelectItemDialog] 3 javaActivityClass=%x', [PtrUInt(javaActivityClass)]));
|
||||||
|
{$endif}
|
||||||
|
|
||||||
|
// Very strangely in the emulator it crashes if we don't refresh the Activity class here
|
||||||
|
javaActivityClass := javaEnvRef^^.FindClass(javaEnvRef,'com/pascal/lcltest/LCLActivity');
|
||||||
|
|
||||||
// ad.setSingleChoiceItems( adapter, -1, MyOnClickListener);
|
// ad.setSingleChoiceItems( adapter, -1, MyOnClickListener);
|
||||||
// DialogInterface.OnClickListener lclselectitemcallback;
|
// DialogInterface.OnClickListener lclselectitemcallback;
|
||||||
@ -316,17 +326,23 @@ begin
|
|||||||
end;
|
end;
|
||||||
lParams[1].i := -1;
|
lParams[1].i := -1;
|
||||||
lParams[2].l := javaAlertDialog;
|
lParams[2].l := javaAlertDialog;
|
||||||
{ __android_log_write(ANDROID_LOG_INFO, 'lclapp', PChar('[TCDWidgetset.ShowSelectItemDialog] JavaMethod_LCLDoPrepareSelectItemDialog='+IntToStr(PtrInt(JavaMethod_LCLDoPrepareSelectItemDialog))));
|
{$ifdef VerboseCDShowSelectItemDialog}
|
||||||
__android_log_write(ANDROID_LOG_INFO, 'lclapp', PChar('[TCDWidgetset.ShowSelectItemDialog] lParams[0].l='+IntToStr(PtrInt(lParams[0].l))));
|
DebugLn('[TCDWidgetset.ShowSelectItemDialog] JavaMethod_LCLDoPrepareSelectItemDialog='+IntToStr(PtrInt(JavaMethod_LCLDoPrepareSelectItemDialog)));
|
||||||
__android_log_write(ANDROID_LOG_INFO, 'lclapp', PChar('[TCDWidgetset.ShowSelectItemDialog] lParams[1].i='+IntToStr(lParams[1].i)));
|
DebugLn('[TCDWidgetset.ShowSelectItemDialog] lParams[0].l='+IntToStr(PtrInt(lParams[0].l)));
|
||||||
__android_log_write(ANDROID_LOG_INFO, 'lclapp', PChar('[TCDWidgetset.ShowSelectItemDialog] lParams[2].l='+IntToStr(PtrInt(lParams[2].l))));
|
DebugLn('[TCDWidgetset.ShowSelectItemDialog] lParams[1].i='+IntToStr(lParams[1].i));
|
||||||
__android_log_write(ANDROID_LOG_INFO, 'lclapp', PChar('[TCDWidgetset.ShowSelectItemDialog] javaActivityClass='+IntToStr(PtrInt(javaActivityClass))));}
|
DebugLn('[TCDWidgetset.ShowSelectItemDialog] lParams[2].l='+IntToStr(PtrInt(lParams[2].l)));
|
||||||
|
DebugLn('[TCDWidgetset.ShowSelectItemDialog] javaActivityClass='+IntToStr(PtrInt(javaActivityClass)));
|
||||||
|
{$endif}
|
||||||
javaEnvRef^^.CallVoidMethodA(javaEnvRef, javaActivityObject, JavaMethod_LCLDoPrepareSelectItemDialog, @lParams[0]);
|
javaEnvRef^^.CallVoidMethodA(javaEnvRef, javaActivityObject, JavaMethod_LCLDoPrepareSelectItemDialog, @lParams[0]);
|
||||||
|
|
||||||
// ad.show();
|
// ad.show();
|
||||||
// __android_log_write(ANDROID_LOG_INFO, 'lclapp', '[TCDWidgetset.ShowSelectItemDialog] 4');
|
{$ifdef VerboseCDShowSelectItemDialog}
|
||||||
|
DebugLn('[TCDWidgetset.ShowSelectItemDialog] 4');
|
||||||
|
{$endif}
|
||||||
javaMethod_AlertDialogBuilder_show := javaEnvRef^^.GetMethodID(javaEnvRef, javaAndroidAppAlertDialogBuilderClass, 'show', '()Landroid/app/AlertDialog;');
|
javaMethod_AlertDialogBuilder_show := javaEnvRef^^.GetMethodID(javaEnvRef, javaAndroidAppAlertDialogBuilderClass, 'show', '()Landroid/app/AlertDialog;');
|
||||||
// __android_log_write(ANDROID_LOG_INFO, 'lclapp', '[TCDWidgetset.ShowSelectItemDialog] 5');
|
{$ifdef VerboseCDShowSelectItemDialog}
|
||||||
|
__android_log_write(ANDROID_LOG_INFO, 'lclapp', '[TCDWidgetset.ShowSelectItemDialog] 5');
|
||||||
|
{$endif}
|
||||||
javaEnvRef^^.CallObjectMethod(javaEnvRef, javaAlertDialog, javaMethod_AlertDialogBuilder_show);
|
javaEnvRef^^.CallObjectMethod(javaEnvRef, javaAlertDialog, javaMethod_AlertDialogBuilder_show);
|
||||||
|
|
||||||
__android_log_write(ANDROID_LOG_INFO, 'lclapp', '[TCDWidgetset.ShowSelectItemDialog] END');
|
__android_log_write(ANDROID_LOG_INFO, 'lclapp', '[TCDWidgetset.ShowSelectItemDialog] END');
|
||||||
|
@ -348,6 +348,10 @@ var
|
|||||||
i, CurIndex, NumMenuItems: Integer;
|
i, CurIndex, NumMenuItems: Integer;
|
||||||
begin
|
begin
|
||||||
Result := 0;
|
Result := 0;
|
||||||
|
|
||||||
|
// Very strangely in the emulator it crashes if we don't refresh the Activity class here
|
||||||
|
javaActivityClass := javaEnvRef^^.FindClass(javaEnvRef,'com/pascal/lcltest/LCLActivity');
|
||||||
|
|
||||||
//{$ifdef VerboseCDEvents}
|
//{$ifdef VerboseCDEvents}
|
||||||
DebugLn(Format('LCLOnMenuAction called kind=%d itemIndex=%d', [kind, itemIndex]));
|
DebugLn(Format('LCLOnMenuAction called kind=%d itemIndex=%d', [kind, itemIndex]));
|
||||||
//{$endif}
|
//{$endif}
|
||||||
@ -393,9 +397,9 @@ begin
|
|||||||
StrPas := lMenuItem.Caption;
|
StrPas := lMenuItem.Caption;
|
||||||
Str := PChar(StrPas);
|
Str := PChar(StrPas);
|
||||||
lJavaString := javaEnvRef^^.NewStringUTF(javaEnvRef, Str);
|
lJavaString := javaEnvRef^^.NewStringUTF(javaEnvRef, Str);
|
||||||
DebugLn(Format('LCLOnMenuAction lJavaString=%x Str=%s', [PtrUInt(lJavaString), StrPas]));
|
DebugLn(Format('LCLOnMenuAction lJavaString=%x Str=%s javaObject_lclmenu_captions=%x', [PtrUInt(lJavaString), StrPas, PtrUInt(javaObject_lclmenu_captions)]));
|
||||||
javaEnvRef^^.SetObjectArrayElement(javaEnvRef, javaObject_lclmenu_captions, CurIndex, lJavaString);
|
javaEnvRef^^.SetObjectArrayElement(javaEnvRef, javaObject_lclmenu_captions, CurIndex, lJavaString);
|
||||||
javaEnvRef^^.DeleteLocalRef(javaEnvRef, str);
|
javaEnvRef^^.DeleteLocalRef(javaEnvRef, javaObject_lclmenu_captions);
|
||||||
|
|
||||||
Inc(CurIndex);
|
Inc(CurIndex);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user