Calling a native function requires three steps: find its address in a shared library (SymbolLookup), describe its C signature (FunctionDescriptor), and create a MethodHandle via Linker.downcallHandle. This downcall handle can then be invoked with Java arguments — the linker handles type conversion and calling convention automatically.
SymbolLookup — finding native symbols