How is that not simple? You just declare the function and then call it. I find it hard to imagine how it could be any more simple than that.
I said it "can be quite simple"; for simple use cases, just using extern and translating the declarations by hand is perfectly viable.
For more complex cases, you use bindgen.
I would love to see how bindgen would handle a function call defined as a preprocessor macro that I mentioned. Because most likely it won't.