This is an example of how to solve the
A NIF (Native Implemented Function) is a function that is implemented in C instead of Erlang. NIFs appear as any other functions to the callers. They belong to a module and are called like any other Erlang functions. The NIFs of a module are compiled and linked into a dynamic loadable shared library (SO in Unix, DLL in Windows). The NIF library must be loaded in runtime by the Erlang code of the module.
Since a NIF library is dynamically linked into the emulator process, this is the fastest way of calling C-code from Erlang (alongside port drivers). Calling NIFs requires no context switches. But it is also the least safe, because a crash in a NIF will bring the emulator down too.
Even if all functions of a module will be NIFs, you still need an Erlang module for two reasons. First, the NIF library must be explicitly loaded by Erlang code in the same module. Second, all NIFs of a module must have an Erlang implementation as well. Normally these are minimal stub implementations that throw an exception. But it can also be used as fallback implementations for functions that do not have native implemenations on some architectures.
NIF libraries are loaded by calling
We use the directive
Loading the NIF library will override the stub implementations
and cause calls to
The NIFs of the module are compiled and linked into a
shared library. Each NIF is implemented as a normal C function. The macro
The function arguments passed to a NIF appears in an array
The first argument to
Function arguments and return values are represented as values
of type
1. Compile the C code.
unix> gcc -o complex6_nif.so -fpic -shared complex.c complex6_nif.c windows> cl -LD -MD -Fe complex6_nif.dll complex.c complex6_nif.c
2. Start Erlang and compile the Erlang code.
> erl Erlang R13B04 (erts-5.7.5) [64-bit] [smp:4:4] [rq:4] [async-threads:0] [kernel-poll:false] Eshell V5.7.5 (abort with ^G) 1> c(complex6). {ok,complex6}
3. Run the example.
3> complex6:foo(3). 4 4> complex6:bar(5). 10 5> complex6:foo("not an integer"). ** exception error: bad argument in function complex6:foo/1 called as comlpex6:foo("not an integer")