Node.js Foreign Function Interface for N-API
node-ffi-napi is a Node.js addon for loading and calling dynamic libraries
without writing any C++ code.
It also simplifies the augmentation of node.js with C code as it takes care of
of boilerplate code to your otherwise simple C. See the
for an example of this use case.
node-ffi-napi assumes you know what you're doing. You can pretty
easily create situations where you will segfault the interpreter and unless
you've got C debugger skills, you probably won't know what's going on.
WARNING: The original API of
node-ffi is left mostly untouched in the
N-API wrapper. However, the API did not have very well-defined properties
in the context of garbage collection and multi-threaded execution. It is
recommended to avoid any multi-threading usage of this library
var ffi = ;var libm = ffi;libm; // 2// You can also access just functions in the current process by passing a nullvar current = ffi;current; // 1234
For a more detailed introduction, see the node-ffi tutorial page.
- Linux, OS X, Windows, or Solaris.
libfficomes bundled with node-ffi-napi; it does not need to be installed on your system.
- The current version is tested to run on Node 6 and above.
Make sure you've installed all the necessary build tools for your platform, then invoke:
$ npm install ffi-napi
Source Install / Manual Compilation
To compile from source it's easiest to use
$ npm install -g node-gyp
Now you can compile
$ git clone git://github.com/node-ffi-napi/node-ffi-napi.git$ cd node-ffi$ node-gyp rebuild
The types that you specify in function declarations correspond to ref's types system. So see its docs for a reference if you are unfamiliar.
V8 and 64-bit Types
Internally, V8 stores integers that will fit into a 32-bit space in a 32-bit integer, and those that fall outside of this get put into double-precision floating point numbers. This is problematic because FP numbers are imprecise. To get around this, the methods in node-ffi that deal with 64-bit integers return strings and can accept strings as parameters.
There is non-trivial overhead associated with FFI calls. Comparing a hard-coded
binding version of
strtoul() to an FFI version of
strtoul() shows that the
native hard-coded binding is orders of magnitude faster. So don't just use the
C version of a function just because it's faster. There's a significant cost in
FFI calls, so make them worth it.
MIT License. See the