* pas2jni: Properly handle Java exceptions when calling a callback Java method.

git-svn-id: trunk@41371 -
This commit is contained in:
yury 2019-02-18 10:19:20 +00:00
parent d0c9392d5e
commit 6d95018c80

View File

@ -1451,6 +1451,8 @@ begin
if d.ProcType = ptFunction then
s:=Format('Result:=%s', [JniToPasType(d.ReturnType, s, False)]);
Fps.WriteLn(s + ';');
// Java exception check
Fps.WriteLn('_HandleJavaException(_env);');
// Processing var/out parameters
for i:=0 to d.Count - 1 do begin
vd:=TVarDef(d[i]);
@ -2184,6 +2186,8 @@ begin
Fps.WriteLn('Result:=JNI_ERR;');
Fps.WriteLn('if vm^^.GetEnv(vm, @env, JNI_VERSION_1_6) <> JNI_OK then exit;');
Fps.WriteLn('CurJavaVM:=vm;');
Fps.WriteLn('_JavaExceptionClass:=env^^.FindClass(env, ''java/lang/Exception'');');
Fps.WriteLn('if _JavaExceptionClass = nil then exit;');
d:=TTypeDef.Create(nil, dtType);
try
@ -2964,7 +2968,6 @@ begin
Fps.WriteLn('begin');
Fps.WriteLn('Result:=_CreateJavaObj(env, jlong(ptruint(PasObj)), ci, cleanup)', 1);
Fps.WriteLn('end;');
Fps.WriteLn;
Fps.WriteLn;
Fps.WriteLn('function _GetPasObj(env: PJNIEnv; jobj: jobject; const ci: _TJavaClassInfo; CheckNil: boolean): pointer;');
@ -2997,14 +3000,23 @@ begin
Fps.DecI;
Fps.WriteLn('end;');
Fps.WriteLn;
Fps.WriteLn('var _JavaExceptionClass: jclass;');
Fps.WriteLn;
Fps.WriteLn('procedure _HandleJNIException(env: PJNIEnv);');
Fps.WriteLn('begin');
Fps.WriteLn('if env^^.ExceptionCheck(env) <> 0 then exit;', 1);
if p.OnExceptionProc <> nil then begin
Fps.WriteLn(Format('%s.%s;', [p.OnExceptionProc.Parent.Name, p.OnExceptionProc.Name]), 1);
p.OnExceptionProc.SetNotUsed;
end;
Fps.WriteLn('env^^.ThrowNew(env, env^^.FindClass(env, ''java/lang/Exception''), PAnsiChar(Utf8Encode(Exception(ExceptObject).Message)));', 1);
Fps.WriteLn('env^^.ThrowNew(env, _JavaExceptionClass, PAnsiChar(Utf8Encode(Exception(ExceptObject).Message)));', 1);
Fps.WriteLn('end;');
Fps.WriteLn;
Fps.WriteLn('procedure _HandleJavaException(env: PJNIEnv);');
Fps.WriteLn('begin');
Fps.WriteLn('if env^^.ExceptionCheck(env) <> 0 then raise Exception.Create(''Java exception.'');', 1);
Fps.WriteLn('end;');
Fps.WriteLn;