在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().
ok4> 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

Windows下使用NIF扩展Erlang方法相关推荐

  1. windows下编译php扩展,windows下开发并编译PHP扩展的方法_php

    现在就简单说一在WINDOWS下开发php扩展的步骤: 首先需要准备的软件有: cygwin 安装路径e:/app/cygwin visual studio C++ 6.0, 修改环境变量,把已经安装 ...

  2. Windows 下开发PHP扩展资源

    1.Windows 下开发PHP扩展 http://www.shinrun.com/htmls/100101-37.html 2.windows下开发PHP扩展dll(无需Cygwin) http:/ ...

  3. cygwin学习linux命令,cygwin 在windows下使用linux命令的方法

    cygwin 在windows下使用linux命令的方法以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 但是cygwin ...

  4. iis怎么更换php版本,Windows 下PHP+IIS的安装方法(PHP版本为5.0)

    Windows 下PHP+IIS的安装方法(PHP版本为5.0) 最近需要使用下PHP相关的东西,查找了一些资料,现将PHP配置方法记录一下,以免以后忘记,呵呵,初学者,各位同学不要拍砖,开始正题,主 ...

  5. [转]cscope在windows下使用mingw编译的方法

    cscope在windows下使用mingw编译的方法      http://blog.csdn.net/mslk/archive/2007/05/06/1598513.aspx cscope在wi ...

  6. springBoot JPA 数据库字段(实体类)带下划线在扩展findBy方法时出错的解决办法

    springBoot JPA 数据库字段(实体类)带下划线在扩展findBy方法时出错的解决办法 参考文章: (1)springBoot JPA 数据库字段(实体类)带下划线在扩展findBy方法时出 ...

  7. windows 下的CACTI的安装方法

    windows 下的CACTI的安装方法 记得第一次工作的时候,主管非得让我学在windows 下的CACTI的安装,把我急的,明明是Linux下的东东,硬让我在windows下面装,不过有不敢不听话 ...

  8. 5.7.24mysql 配置安卓,安卓按键精灵连接MySQL全面解析Windows下安装 mysql5.7的方法

    关于在windows下安装mysql 5.7 •要注意的新坑: 5.7版本安装后ROOT账号是有默认的密码的,这个密码在windows下可以在mysql.ini配置文件指定的data文件夹下面,那个为 ...

  9. Windows下opencc安装及使用方法

    Windows下opencc安装及使用方法 安装方法 1.获取opencc安装包 获取链接https://github.com/BYVoid/OpenCC/wiki/Download 2.选择适合自己 ...

最新文章

  1. 判断页面元素存在与否
  2. 【CVPR2021】旷视研究院入选学术成果盘点
  3. 数据中心夏季如何防雷
  4. alexnet训练多久收敛_AlexNet浅析
  5. Eclipse新建web项目出现The superclass javax.servlet.http.HttpServlet was not found on the Java Build Path
  6. 实验5: IOS的升级与恢复
  7. java判断线段是否相交函数_计算几何-判断线段是否相交
  8. Java中正则表达式替换字符串
  9. 路径中,连续多个目录分隔符不影响,仍按照一个处理
  10. 职场:如何成为PPT高手【01思维篇】
  11. 为什么会有hash冲突?
  12. 软考系统集成项目管理工程师 | 计算题公式汇总
  13. 简易解inode802.1x认证实战(6)交叉编译
  14. 经典单片机c语言教程 pdf下载,51单片机经典教程.pdf
  15. 2021云计算技能竞赛真题
  16. 羽素携手维琪共展科研实力,造护肤“芯”产链
  17. python path包的使用详解
  18. linux 进程rt,RTLinux进程调度策略总结
  19. 如何保证游戏长盛不衰
  20. vnpy2.0与simnow搭建简单的量化策略开发环境

热门文章

  1. USB学习笔记(4)STM32关于USB库的解读
  2. 随机生成车牌号码 解决出现不符合规则的车牌号
  3. 如果学号的前两位表示年级,要查找98级女生的姓名,请写出相应的SQL语句
  4. mysql数据库实验报告四
  5. 这样回复你微信的人,最值得深交
  6. win10原生输入法间隔变大解决办法
  7. 《正在到来的数据革命:大数据》阅读笔记
  8. 诚之和:网络安全已成为最紧迫、最基础的安全问题,监管制度已在路上
  9. 笔记本 重启 自动修失败 C:WindowsSystem32LogfilesSrtSrtTrail.txt 的 若干解决方法
  10. Package name 'com.cetc52.platform' does not correspond to the file path 'java.com.cetc52.platform'问题