Bindings crash on Windows where they would not before

jextract at xpple.dev jextract at xpple.dev
Mon Mar 31 11:58:07 UTC 2025


Thank you for the responses!

> Maybe the problem is that you are trying to generate Windows bindings 
> from a Linux machine? [...]. It probably just happened that you never 
> worked with libraries using `long` (which, for the portability issues 
> you noted, is often avoided).

You could say that. Although, yes it is indeed the case the `long` type 
is not used in my case, so there should not be any real problems.

> As a workaround, you could try deleting the layout for `C_LONG` in the 
> generated bindings.

I thought of that too, but it is kind of manual (not ideal to automate). 
Since I am generating the bindings on GitHub Actions, it would be 
preferable if there were a more directly supported fix. Perhaps a CLI 
parameter to apply the lenience as described by Maurizio?

> Perhaps, a slightly more lenient way to handle this would be to just 
> leave the layouts to `null` if there's a mismatch (instead of 
> throwing).

Kind regards,


Frederik van der Els

On 2025-03-31 13:11, Jorn Vernee wrote:
>> It probably just happened that you never worked with libraries using 
>> `long`
> 
> I think this is probably the case as well. As a workaround, you could
> try deleting the layout for `C_LONG` in the generated bindings. If the
> library is indeed portal enough, there should be no compilation
> errors.
> 
> Jorn
> 
> On 31-3-2025 11:02, Maurizio Cimadamore wrote:
>> Hi,
>> thanks for the report.
>> 
>> I think the fix should still take into account for platform 
>> mismatches. Note that we now have a shared section, containing 
>> constants  for all platforms) and a follow up sections where we 
>> initialize platform-specific constants.
>> 
>> The shared section only contains LONG_LONG, which is always 64 bits, 
>> even in Windows.
>> 
>> The followup section contains LONG, which is 32bit/OfInt on Windows, 
>> and 64bit/OfLong elsewhere. What the follow up section does is 
>> determined by `TypeImpl.IS_WINDOWS`, which is defned here:
>> 
>> https://github.com/openjdk/jextract/blob/master/src/main/java/org/openjdk/jextract/impl/TypeImpl.java#L45C1-L45C98 
>> So, on Windows the right thing should happen.
>> 
>> Maybe the problem is that you are trying to generate Windows bindings 
>> from a Linux machine? While the code used to work differently (e.g. no 
>> class cast exception), the bindings might behave unpredictably on 
>> Windows. It probably just happened that you never worked with 
>> libraries using `long` (which, for the portability issues you noted, 
>> is often avoided). If you have e.g. a struct containing a long field, 
>> the size and offsets of that struct would be completely bogus, so I 
>> would not recommend to use jextract in that cross-platform way -- it 
>> is not designed to work that way. The new error message points this 
>> out a little earlier (before something worse occurs).
>> 
>>> For instance the platform check could be done at runtime.
>> 
>> Yes, but at the end of the day we have to assign either a `OfLong` 
>> field, or a `OfLongLong` field. And we can't change the type of the 
>> field at runtime. Which means the type of the field is picked at 
>> extraction time (this was also the case before the fix), and at 
>> runtime we cast whatever `canonicalLayout` returns to the expected 
>> type (which throws if there is a mismatch).
>> 
>> Perhaps, a slightly more lenient way to handle this would be to just 
>> leave the layouts to `null` if there's a mismatch (instead of 
>> throwing). This means that bindings only using "portable" layouts 
>> would still work. But, while this might fix your issue, I'm not 100% 
>> sure that would be much better in the general case.
>> 
>> Maurizio
>> 
>> 


More information about the jextract-dev mailing list