diff --git a/utils/pas2jni/writer.pas b/utils/pas2jni/writer.pas index b6bf3fab30..50fac101a7 100644 --- a/utils/pas2jni/writer.pas +++ b/utils/pas2jni/writer.pas @@ -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;