3 ms·
On the other hand C/C++ APIs only truly exist in textual format. Without going through C you don't have access to type definitions (you have to redeclare them
by marwis 3y ago
On the other hand C/C++ APIs only truly exist in textual format.
Without going through C you don't have access to type definitions (you have to redeclare them in Java) or macros (sometimes not even impossible).
Structure layout might be different across platforms/versions/variants, symbols can be aliased through preprocessor etc. even though end API is the same.
This is a problem with any FFI that tries to avoid C.
Look at this mess of trying to do POSIX in JNR: https://github.com/jnr/jnr-posix/tree/master/src/main/java/jnr/posix https://github.com/jnr/jnr-posix/tree/master/src/main/java/j... - each system needs different implementation and within them there is further branching based on versions. There is no guarantee that any of this will work in the future (except on Windows which maintains stable userland ABI).
- mike_hearn 3y agoPanama FFI has a tool called jextract that parses C headers and writes the Java bindings for you.
- marwis 3y agoBut can it generate bindings for multiple abi variants? This would seem extremely complicated to automate.
- mike_hearn 3y agoIt can understand preprocessor macros, and the FFI's CLinker class understands different platform ABIs. So I guess you could generate several different packages with variant ABIs, abstract over them and then use whichever one seems to be available.
- marwis 3y agoAbstract over them meaning writing wrappers by hand?
- grishka 3y agoThe ABI stuff is taken care of at runtime.
- marwis 3y agoWhat do you mean?
- grishka 3y agoYou only specify the function signatures and structs. The JVM then figures out how to put arguments and return values into registers/stack/whatever at runtime, depending on which OS and CPU it's running on. That's what the `CLinker` class is responsible for. It's like regular dynamic linking, but taken a bit further.
- marwis 3y agoThe problem is structs and function signatures of standard APIs can have differences for each os/version combination.
- grishka 3y agoThen you have to take care of making sure you call the right thing. But I suppose this doesn't happen very often because OS APIs usually maintain backwards compatibility. Also a well-designed API would take complex structs by pointer, thus allowing the addition of fields at the end without breaking the ABI.