diff --git a/utils/pas2jni/ppuparser.pas b/utils/pas2jni/ppuparser.pas index a19d264a14..9d74803212 100644 --- a/utils/pas2jni/ppuparser.pas +++ b/utils/pas2jni/ppuparser.pas @@ -260,9 +260,9 @@ var if s = 'class' then ct:=ctClass else -// if s = 'interface' then -// ct:=ctInterface -// else + if s = 'interface' then + ct:=ctInterface + else if s = 'object' then ct:=ctObject else diff --git a/utils/pas2jni/writer.pas b/utils/pas2jni/writer.pas index bcc11d7986..a44e67fc75 100644 --- a/utils/pas2jni/writer.pas +++ b/utils/pas2jni/writer.pas @@ -505,15 +505,19 @@ var procedure WriteTypeCast(const AName: string; SecondPass: boolean); var - s: string; + s, ss: string; begin with TClassDef(d) do begin if HasReplacedItems and not SecondPass then s:='protected' else s:='public'; - Fjs.WriteLn(Format('%s %s(PascalObject obj) { super(obj); }', [s, AName])); - Fjs.WriteLn(Format('%s %s(long objptr) { super(objptr); }', [s, AName])); + if (CType = ctInterface) and (AncestorClass = nil) then + ss:=' __Init();' + else + ss:=''; + Fjs.WriteLn(Format('%s %s(PascalObject obj) { super(obj);%s }', [s, AName, ss])); + Fjs.WriteLn(Format('%s %s(long objptr) { super(objptr);%s }', [s, AName, ss])); end; end; @@ -575,16 +579,33 @@ begin if d.CType in [ctObject, ctRecord] then s:=s + Format('%s.system.Record', [JavaPackage]) else - s:=s + 'PascalObject'; + if d.CType = ctInterface then + s:=s + 'PascalObjectEx' + else + s:=s + 'PascalObject'; end; Fjs.WriteLn(s + ' {'); Fjs.IncI; - if d.CType in [ctObject, ctRecord] then begin - Fjs.WriteLn('private native void __Destroy(long pasobj);'); - Fjs.WriteLn(Format('protected %s(long objptr, boolean cleanup) { __Init(objptr, cleanup); }', [d.Name])); - Fjs.WriteLn(Format('public %s() { __Init(0, true); }', [d.Name])); - Fjs.WriteLn(Format('public void __Release() { __Destroy(_pasobj); super.__Release(); }', [d.Name])); - Fjs.WriteLn(Format('public int __Size() { return %d; }', [d.Size])); + case d.CType of + ctObject, ctRecord: + begin + Fjs.WriteLn('private native void __Destroy(long pasobj);'); + Fjs.WriteLn(Format('protected %s(long objptr, boolean cleanup) { __Init(objptr, cleanup); }', [d.Name])); + Fjs.WriteLn(Format('public %s() { __Init(0, true); }', [d.Name])); + Fjs.WriteLn(Format('public void __Release() { __Destroy(_pasobj); _pasobj=0; }', [d.Name])); + Fjs.WriteLn(Format('public int __Size() { return %d; }', [d.Size])); + end; + ctInterface: + begin + if d.AncestorClass = nil then begin + Fjs.WriteLn('public void __Release() { if (_pasobj != 0) _Release(); _pasobj = 0; }'); + Fjs.WriteLn('public void __Init() { _cleanup=true; if (_pasobj != 0) _AddRef(); }'); + s:='_pasobj=objptr; __Init();'; + end + else + s:='super(objptr, cleanup);'; + Fjs.WriteLn(Format('protected %s(long objptr, boolean cleanup) { %s }', [d.Name, s])); + end; end; WriteTypeCast(n, False);