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