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:
sekelsenmat 2012-03-28 18:24:41 +00:00
parent 9e6f83df53
commit 09b5be1b02
2 changed files with 32 additions and 12 deletions

View File

@ -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');

View File

@ -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);