mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-21 13:09:32 +02:00
* pas2jni: Properly handle Java exceptions when calling a callback Java method.
git-svn-id: trunk@41371 -
This commit is contained in:
parent
d0c9392d5e
commit
6d95018c80
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user