Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Mailing lists / fpc-pascal / 2018-08

Type helper for JNI pointers

3 messages · 2 people · –

Reply by email Subscribe to this list Your subscription

Read-only archive. Use j and k to move between messages.

Benito van der Zander

Hi,

when you use JNI functions you always need to repeat "env" a lot:

var
   javaClass: jclass;
   javaObj: jobject;
begin
   //javaClass := ...
   javaObj := env^^.NewObject(env, javaClass)
   env^^.DeleteLocalRef(env, javaObj);
end;

So I thought you could declare type helpers for jobject and jclass,

   TjobjectHelper = type helper for jobject
      procedure DeleteLocalRef;
   end;
   TjclassHelper = type helper for jclass
      procedure NewObject;
   end;

And then just write

var
   javaClass: jclass;
   javaObj: jobject;
begin
   //javaClass := ...
   javaObj := javaClass.NewObject()
   javaObj.DeleteLocalRef;
end;

But this does not work, because fpc thinks jclass and jobject are the same type, so there is only one type helper for both of the types allowed.

Because it is declared as

type
      jobject=pointer;
      jclass=jobject;

What can we do about this?

Bye,

Benito

Reply by email

Andrew Haines
to Benito van der Zander
Benito van der Zander wrote 14 lines
But this does not work, because fpc thinks jclass and jobject are the same type, so there is only one type helper for both of the types allowed. Because it is declared as type      jobject=pointer;      jclass=jobject; What can we do about this?

I haven't used type helpers but why not change to defines like

type
   jObjectRec = record end;
   jObject= ^jObjectRec;
   jClassRec = record end;
   jClass = ^jClassRec;

or possibly simpler you could try
  jclass = type(jobject); // I believe this forces a new type and is not just an alias

Regards,

Andrew

Reply by email

Benito van der Zander
to Andrew Haines

Hi,

Show quoted text 12 lines
I haven't used type helpers but why not change to defines like type   jObjectRec = record end;   jObject= ^jObjectRec;   jClassRec = record end;   jClass = ^jClassRec; or possibly simpler you could try   jclass = type(jobject); // I believe this forces a new type and is not just an alias

that looks better.

Who can  change them? These jobject/jclass type definitions are part of fpc...

Although type is weird

type a = type (pointer); type b = type (a);

does not compile, duplicate identifier a

type a = type (pointer); type b = type a;
compiles, but a type helper for cannot use self as pointer. self  nil
=> operator is not overloaded. But you can do writeln(self);
type a = type pointer; type b = type (a);

does not compile, duplicate identifier a

type a = type pointer; type b = type a;

compiles, and is like a pointer, but unlike case 2, you cannot do writeln(self) in the type helper

type a = type (pointer); type b = type (pointer);

does not compile, duplicate identifier

type a = type (pointer); type b = type pointer;

does not compile, error in type definition

type a = type pointer; type b = type (pointer);

compiles

type a = type pointer; type b = type pointer;

compiles

Cheers,
Benito

Andrew Haines wrote 40 lines
On 08/12/2018 07:42 AM, Benito van der Zander wrote: > > > But this does not work, because fpc thinks jclass and jobject are the > same type, so there is only one type helper for both of the types > allowed. > > Because it is declared as > > type >      jobject=pointer; >      jclass=jobject; > > > What can we do about this? > I haven't used type helpers but why not change to defines like type   jObjectRec = record end;   jObject= ^jObjectRec;   jClassRec = record end;   jClass = ^jClassRec; or possibly simpler you could try   jclass = type(jobject); // I believe this forces a new type and is not just an alias Regards, Andrew _______________________________________________ fpc-pascal maillist - http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Reply by email