Some small feedback regading jextract as a user

Jorn Vernee jorn.vernee at oracle.com
Thu Nov 12 23:08:43 UTC 2020


Hi Jerven,

No, I did not do anything special, I just followed your instructions in 
your reply to Maurizio (running `cargo build` with the modified build.rs 
was all I did).

FWIW, the file I get out of cbindgen does not include 'HashGraph' 
anywhere, and the line 13 that supposedly throws the error is empty in 
my file [1].

Jorn

[1] :

#include <stdarg.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdlib.h>

typedef struct CGraph CGraph;

typedef struct EdgesIter EdgesIter;

typedef struct HandlesIter HandlesIter;

typedef struct PathsIter PathsIter;
// <-- line 13
typedef struct {
   uint64_t left;
   uint64_t right;
} EdgeHolder;

CGraph *load_hashgraph(const uint8_t *file_name, uintptr_t file_name_len);

void free_hashgraph(CGraph *graph);

HandlesIter *graph_handles(const CGraph *graph);

void free_handles_iter(HandlesIter *handles);

uint64_t handles_next(HandlesIter *handles);

bool handles_has_next(HandlesIter *handles);

EdgesIter *graph_edges(const CGraph *graph);

void free_edges_iter(EdgesIter *handles);

EdgeHolder edges_next(EdgesIter *edges);

bool edges_has_next(EdgesIter *edges);

PathsIter *graph_paths(const CGraph *graph);

void free_paths_iter(PathsIter *paths);

int64_t paths_next(PathsIter *paths);

bool paths_has_next(PathsIter *paths);

On 12/11/2020 23:50, Jerven Tjalling Bolleman wrote:
> Hi Jorn,
>
> Thank you so much for pointing that out.
>
> That said I am still getting a
>
> java.lang.RuntimeException: libhandlegraph-ffi-c.h:13:3: error: 
> unknown type name 'HashGraph'
>
> The libhandlegraph-ffi-c.h is now a C file, so that part worked.
> Did you do anything special regarding your cargo build?
> Sorry to ask, after you have been super helpful already!
>
> Regards,
> Jerven
>
> On 2020-11-12 23:26, Jorn Vernee wrote:
>> Hi,
>>
>> On 12/11/2020 21:47, Jerven Tjalling Bolleman wrote:
>>> Dear panama-devs,
>>>
>>> I hope this feedback is in the useful category. My feedback is 
>>> regarding the jextract tool and ffi. Most of it is trivial but I 
>>> hope it is still useful.
>>>
>>> No --version or -v option to quickly get the exact version of 
>>> jextract (would make future feedback easier to pinpoint).
>>>
>>> Assume the jextract user has minimal or no knowledge (like me) of 
>>> how the library they want to wrap was built. For example the first 
>>> error I ran into was “fatal error: 'cstdarg' file not found” which 
>>> required “-C -x -C c++” to be added to the command. This was not 
>>> intuitive and certainly not the first thing I tried (I started with 
>>> trying different -I combinations. Specifically, I am trying to wrap 
>>> a rust library with a header generated by rust cbindgen. So thinking 
>>> of needing to add clang options to jextract was not high on my lists 
>>> of things to do.
>> The problem here seems that cbindgen produces a C++ header file, not a
>> C file, and then exports a bunch of functions with C linkage (i.e.
>> extern "C"). Note that jextract currently only handles C well, so
>> parsing C++ will likely fail (e.g. with an NPE).
>>
>> It looks like cbindgen supports generating C headers as well [1]. And,
>> after some changes to your build.rs [2], jextract works with the
>> following command:
>>
>> jextract -l rs_handlegraph_ffi -t rs.handlegraph -d out 
>> libhandlegraph-ffi-c.h
>>
>> (Note that -l takes a library name, not a path). Producing the 
>> following files:
>>
>> out
>> └───rs
>>     └───handlegraph
>>             C.class
>>             libhandlegraph_ffi_c_h$atexit$x0.class
>>             libhandlegraph_ffi_c_h$at_quick_exit$x0.class
>> libhandlegraph_ffi_c_h$bsearch$_CompareFunction.class
>> libhandlegraph_ffi_c_h$bsearch_s$_CompareFunction.class
>>             libhandlegraph_ffi_c_h$constants$0.class
>>             libhandlegraph_ffi_c_h$div_t.class
>>             libhandlegraph_ffi_c_h$EdgeHolder.class
>>             libhandlegraph_ffi_c_h$ldiv_t.class
>> libhandlegraph_ffi_c_h$lfind$_CompareFunction.class
>>             libhandlegraph_ffi_c_h$lldiv_t.class
>> libhandlegraph_ffi_c_h$lsearch$_CompareFunction.class
>>             libhandlegraph_ffi_c_h$mbstate_t.class
>>             libhandlegraph_ffi_c_h$onexit$_Func.class
>> libhandlegraph_ffi_c_h$qsort$_CompareFunction.class
>> libhandlegraph_ffi_c_h$qsort_s$_CompareFunction.class
>>             libhandlegraph_ffi_c_h$_CRT_DOUBLE.class
>>             libhandlegraph_ffi_c_h$_CRT_FLOAT.class
>>             libhandlegraph_ffi_c_h$_div_t.class
>>             libhandlegraph_ffi_c_h$_LDBL12.class
>>             libhandlegraph_ffi_c_h$_ldiv_t.class
>>             libhandlegraph_ffi_c_h$_LDOUBLE.class
>> libhandlegraph_ffi_c_h$_lfind$_CompareFunction.class
>> libhandlegraph_ffi_c_h$_lfind_s$_CompareFunction.class
>>             libhandlegraph_ffi_c_h$_lldiv_t.class
>>             libhandlegraph_ffi_c_h$_LONGDOUBLE.class
>> libhandlegraph_ffi_c_h$_lsearch$_CompareFunction.class
>> libhandlegraph_ffi_c_h$_lsearch_s$_CompareFunction.class
>>             libhandlegraph_ffi_c_h$_Mbstatet.class
>>             libhandlegraph_ffi_c_h$_onexit$_Func.class
>> libhandlegraph_ffi_c_h$_set_invalid_parameter_handler$_Handler.class
>> libhandlegraph_ffi_c_h$_set_purecall_handler$_Handler.class
>> libhandlegraph_ffi_c_h$_set_thread_local_invalid_parameter_handler$_Handler.class 
>>
>> libhandlegraph_ffi_c_h.class
>> libhandlegraph_ffi_c_h.class
>>             libhandlegraph_ffi_c_h.class
>>             RuntimeHelper$VarargsInvoker.class
>>             RuntimeHelper.class
>>
>> HTH,
>> Jorn
>>
>>>
>>> Having fixed that I ran into a null pointer exception. i.e.
>>> WARNING: Using incubator modules: jdk.incubator.jextract, 
>>> jdk.incubator.foreign
>>> java.lang.NullPointerException
>>>
>>> While we might dislike stack traces. I think a bug report (to myself 
>>> regarding the C code) or to you would be easier to work on when you 
>>> have a stack trace.
>>>
>>> When generating the helloworld example I needed to compile with 
>>> -fPIC. Which the document at
>>> https://urldefense.com/v3/__https://github.com/openjdk/panama-foreign/blob/foreign-jextract/doc/panama_jextract.md*jextract-a-jar-file-for-helloworldh__;Iw!!GqivPVa7Brio!ORVvc0YKf1IezH9e1ZzHs3kEoc7rXWUi_45S5WOZw9LQeW859IDHJq7ySlh27tcF$ 
>>> claims generates a jar file but actually generates a directory with 
>>> class files. The example worked fine with clang 10.0.1 but my fedora 
>>> 10.2.1 gcc needed -fPIC.
>>>
>>> Regarding the FFI interface, I would love to see more examples 
>>> regarding the group layout functionality.
>>>
>>> Otherwise with jextract I quite quickly ran into error: unknown type 
>>> name without much of a suggestion why a certain type was not known. 
>>> The libraries added to the command line should have had the types. 
>>> And I am still working on this one.
>>>
>>> That said the tools have lots of promise and please keep working on 
>>> them!
>>>
>>> Regards,
>>> Jerven
>>
>> [1] : 
>> https://urldefense.com/v3/__https://github.com/eqrion/cbindgen*quick-start__;Iw!!GqivPVa7Brio!ORVvc0YKf1IezH9e1ZzHs3kEoc7rXWUi_45S5WOZw9LQeW859IDHJq7ySlzVd6-F$ 
>> [2] :
>>
>> diff --git a/build.rs b/build.rs
>> index 2dd7493..02b36e6 100644
>> --- a/build.rs
>> +++ b/build.rs
>> @@ -7,6 +7,7 @@ fn main() {
>>
>>      cbindgen::Builder::new()
>>        .with_crate(crate_dir)
>> +      .with_language(cbindgen::Language::C)
>>        .generate()
>>        .expect("Unable to generate bindings")
>>        .write_to_file("libhandlegraph-ffi-c.h");
>


More information about the panama-dev mailing list