在Erlang中,NIF(Native Implemented Function)被用来扩展erlang的某些功能,一般用来实现一些erlang很难实现的,或者一些erlang实现效率不高的功能。
NIF使用C开发,效率和C接近,比纯erlang实现要高。NIF会编译成动态库,直接动态加载到erlang进程空间调用,也是erlang扩展新方法最高效的做法。调用NIF不用上下文的切换开销,但是也有代价,NIF的crash会导致整个Erlang进程crash。
下面讲述如何在Windows下使用NIF扩展Erlang
一、前期准备
1、下载erlang二进制安装包,R16B02 Windows Binary File,前面是版本号。安装过erlang的跳过这一步。
2、安装erlang后,到安装目录取erlang头文件和静态库包:
erl头文件:erl5.10.2\erts-5.10.2\include\
erl静态库:erl5.10.2\erts-5.10.2\lib,静态库这里只用到erts_MD.lib
二、编译NIF库
1、新建一个空项目,命名为niftest
2、把erl头文件复制到工程目录下,并添加到工程项目中
3、把erts_MD.lib复制到工程目录下
4、修改项目属性,常规类型选动态库(.dll),字符集选使用 Unicode 字符集
5、修改项目属性,VC++ 目录的包含目录添加“include”
6、把以下代码保存为niftest.c文件,添加进工程
- #ifdef _WIN32
- # define WIN32_LEAN_AND_MEAN
- # include <Windows.h>
- # pragma comment(lib, "erts_MD.lib")
- #endif
- #include "erl_nif.h"
- static ERL_NIF_TERM hello(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
- {
- return enif_make_string(env, "Hello world!", ERL_NIF_LATIN1);
- }
- static ErlNifFunc nif_funcs[] =
- {
- {"hello", 0, hello}
- };
- ERL_NIF_INIT(niftest,nif_funcs,NULL,NULL,NULL,NULL)
7、编译项目,可以在Debug下找到编译好的erl动态库:niftest.dll
- /******** 无情的分割线 ********* /
- 作者:没有开花的树
- 博客:blog.csdn.net/mycwq
- / ******* 无情的copy *********/
三、在erlang中使用NIF库
1、把以下代码保存为niftest.erl文件,和上面编译的niftest.dll放一起
- -module(niftest).
- -export([init/0, hello/0]).
- init() ->
- erlang:load_nif("./niftest", 0).
- hello() ->
- "this function is not defined!".
- 1>c(niftest).
- {ok,niftest}
- 2> niftest:hello().
- this function is not defined!
- 3> niftest:init().
- ok
- 4> niftest:hello().
- "Hello world!"
完整demo下载:http://download.csdn.net/detail/cwqcwk1/6800955,这个DEMO是在32位系统下编译,64位系统请
重新编译
参考
http://blog.csdn.net/mycwq/article/details/17527485
http://www.erlang.org/doc/man/erl_nif.html