|Initial release||October 7, 1996|
3.2.1 / November 12, 2014
3.3-rc0 / April 2, 2018
|Written in||C, Assembly language|
|Operating system||Unix-like, Microsoft Windows, OS X, iOS, BareMetal OS|
libffi is a foreign function interface library. It provides a C programming language interface for calling natively compiled functions given information about the target function at run time instead of compile time. It also implements the opposite functionality: libffi can produce a pointer to a function that can accept and decode any combination of arguments defined at run time.
libffi is most often used as a bridging technology between compiled and interpreted language implementations. libffi may also be used to implement plug-ins, where the plug-in's function signatures are not known at the time of creating the host application.
Notable users include Python, Haskell, Dalvik, F-Script, PyPy, PyObjC, RubyCocoa, JRuby, Rubinius, MacRuby, gcj, GNU Smalltalk, IcedTea, Cycript, Pawn, Squeak, Java Native Access, Common Lisp (via CFFI), Racket, Embeddable Common Lisp and Mozilla.
libffi, originally developed by Anthony Green, was inspired by the Gencall library from Silicon Graphics. Gencall was developed by Gianni Mariani, then employed by SGI, for the purpose of allowing calls to functions by address and creating a call frame for the particular calling convention. Anthony Green refined the idea and extended it to other architectures and calling conventions and open sourcing libffi.
The libffi library is useful in building a bridge between interpreted and natively compiled code. Some notable users include:
- Dynamically generates Cocoa classes written in F-Script.
- GNU Guile
- libffi is used in Guile 1.9.8 and onwards
- libffi has been used for the majority of the FFI performed by the GHC since late 2009.
- The open-source implementation of the Java Platform Standard Edition uses libffi to bridge between the interpreter and native code for Zero-Assembly port.
- Java Native Access (JNA)
- The JNI-free way to call native code from Java.
- The standard foreign function interface library for Common Lisp CFFI includes the cffi-libffi system to include support for passing and returning structure arguments by value.
- The default, most-widely used implementation of the Python programming language uses libffi in the standard ctypes library.
- Call Objective-C code from Python on Mac OS X.
- Call C code from this popular Scheme implementation (also used as the implementation platform for Paul Graham's new Lisp, Arc).
- A libffi wrapper in the Ruby Standard Library
- A Foreign Function Interface extension for Ruby.
- Call Objective-C code from Ruby on Mac OS X.