Type helper for JNI pointers

classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

Type helper for JNI pointers

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 



_______________________________________________
fpc-pascal maillist  -  [hidden email]
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
Reply | Threaded
Open this post in threaded view
|

Re: Type helper for JNI pointers

Free Pascal - General mailing list



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  -  [hidden email]
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
Reply | Threaded
Open this post in threaded view
|

Re: Type helper for JNI pointers

Benito van der Zander
Hi,


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 



Am 23.08.2018 um 04:23 schrieb Andrew Haines via fpc-pascal:



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  -  [hidden email]
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal


_______________________________________________
fpc-pascal maillist  -  [hidden email]
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal