CLinker migration from jdk17 to jdk18
Maurizio Cimadamore
maurizio.cimadamore at oracle.com
Tue Apr 5 14:44:52 UTC 2022
Forgot to add, we do have a couple of tutorials on the Memory Access API
and Foreign Linker API available:
https://github.com/openjdk/panama-foreign/blob/foreign-jextract/doc/panama_memaccess.md
https://github.com/openjdk/panama-foreign/blob/foreign-jextract/doc/panama_ffi.md
These reflect the API as available in Java 18.
Maurizio
On 05/04/2022 15:32, Maurizio Cimadamore wrote:
> Hi Lev,
> the ingredients are pretty much all there (in one form or another).
>
> The big difference from 17 to 18 is that ValueLayout now contain a
> link to the Java carrier that should be used to dereference them.
>
> Which means we don't need a MethodType in downcallMethodHandle.
>
> Another difference is that there's no C_INT, C_POINTER anymore. You
> can use JAVA_INT, JAVA_LONG, ADDRESS (which is the same as using the
> JNI types jint, jlong, ...). Or, you can define alias for C types in
> your platform if you want (jextract will do that).
>
> So, in short, your example will become something like:
>
> ```
> h_native = CLinker.systemCLinker()
> .downcallHandle(
> libLookup.lookup("somefunc").get(),
> FunctionDescriptor.of(
> ValueLayout.ADDRESS,
> ValueLayout.JAVA_INT,
> ValueLayout.ADDRESS,
> ValueLayout.ADDRESS,
> ValueLayout.JAVA_INT,
> ValueLayout.JAVA_INT
> )
> );
> ```
>
> (the above assumes LP64 - e.g. where a C int is 32 bits).
>
> As for DSL, we have abandoned that path a long time ago - and decided
> to focus on something lower level. There are projects which are using
> Panama as a backend, to define their own DSLs/annotations [1].
>
> Cheers
> Maurizio
>
> [1] - https://github.com/boulder-on/JPassport/
>
> On 05/04/2022 15:23, Lev Serebryakov wrote:
>>
>> I have this code, which works on JDK-17:
>>
>> h_native = CLinker.getInstance()
>> .downcallHandle(
>> libLookup.lookup("somefunc").get(),
>> MethodType.methodType(
>> MemoryAddress.class,
>> int.class,
>> MemoryAddress.class,
>> MemoryAddress.class,
>> int.class,
>> int.class
>> ),
>> FunctionDescriptor.of(
>> CLinker.C_POINTER,
>> CLinker.C_INT,
>> CLinker.C_POINTER,
>> CLinker.C_POINTER,
>> CLinker.C_INT,
>> CLinker.C_INT
>> )
>> );
>>
>> But it doesn't work on JDK-18 and I don't see proper way to convert
>> it. Is "CLinker.systemCLinker()" replacement for ".getInstance()"?
>> Where are built-in types live now?
>>
>>
>> BTW. my previous experiments with panama/foreign were long ago, and
>> then there was complex DSL to describe native data structures. Is it
>> gone forever?
>>
>>
>> Thank you.
>>
More information about the panama-dev
mailing list