在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!".

2、运行erlang代码

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

参考

http://blog.csdn.net/mycwq/article/details/17527485
http://www.erlang.org/doc/man/erl_nif.html

最新文章

  1. CollectionView水平和竖直瀑布流的实现
  2. shell命令获取最新文件的名称
  3. 【OpenWRT】【RT5350】【二】烧写OpenWrt到RT5350开发板
  4. cxGrid的使用方法
  5. 使用sp_addextendedproperty添加描述信息
  6. session和cookie的前后的操作
  7. Codeforces Round #203 (Div. 2) A.TL
  8. x9015数字电位器应用
  9. CSU 1552: Friends 图论匹配+超级大素数判定
  10. SelectedValue,SelectedValuePath,SelectedValueBinding,DisplayMemberPath讲解
  11. [HDU 1806] Frequent values
  12. Java程序员面试题集(1-50)(转)
  13. Asp.net 视频摘要
  14. EasyARM i.mx287学习笔记——minicom配置和使用
  15. arcgis for javascript 自定义infowindow
  16. vim配置分享(持续更新中)
  17. Python&#160;基于Python实现的ssh兼sftp客户端(上)
  18. MySQL存储写入速度慢分析
  19. java 实验1
  20. 20155309 2016-2017-2《Java程序设计》课程总结

热门文章

  1. 物联网操作系统HelloX V1.79发布公告
  2. POJ 1306 Combinations
  3. ssh-keygen的用法
  4. OpenLayers调用arcgis server发布的地图服务
  5. HEAD
  6. C# ComboBox自动完成功能的示例
  7. 有关loading share object file libjvm.so: xxxxx 的那些问题
  8. hibernate的组成部分
  9. OTG_FS_ID功能及引申
  10. Json转换插件