在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文件,添加进工程

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片

  1. #ifdef _WIN32
  2. #   define WIN32_LEAN_AND_MEAN
  3. #   include <Windows.h>
  4. #   pragma comment(lib, "erts_MD.lib")
  5. #endif
  6. #include "erl_nif.h"
  7. staticERL_NIF_TERM hello(ErlNifEnv* env,intargc,constERL_NIF_TERM argv[])
  8. {
  9. returnenif_make_string(env,"Hello world!", ERL_NIF_LATIN1);
  10. }
  11. staticErlNifFunc nif_funcs[] =
  12. {
  13. {"hello", 0, hello}
  14. };
  15. ERL_NIF_INIT(niftest,nif_funcs,NULL,NULL,NULL,NULL)

7、编译项目,可以在Debug下找到编译好的erl动态库:niftest.dll

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片

  1. /********  无情的分割线 ********* /
  2. 作者:没有开花的树
  3. 博客:blog.csdn.net/mycwq
  4. / *******   无情的copy  *********/

三、在erlang中使用NIF库

1、把以下代码保存为niftest.erl文件,和上面编译的niftest.dll放一起

[plain] view plaincopy在CODE上查看代码片派生到我的代码片

  1. -module(niftest).
  2. -export([init/0, hello/0]).
  3. init() ->
  4. erlang:load_nif("./niftest", 0).
  5. hello() ->
  6. "this function is not defined!".

2、运行erlang代码

[plain] view plaincopy在CODE上查看代码片派生到我的代码片

  1. 1>c(niftest).
  2. {ok,niftest}
  3. 2> niftest:hello().
  4. this function is not defined!
  5. 3> niftest:init().
  6. ok
  7. 4> niftest:hello().
  8. "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

[Erlang]如何使用NIF相关推荐

  1. Erlang中的nif

    NIF即是(Native Implemented Function),由c实现的函数.其实即是一些动态库比如So.DLL... nif在erlang的r13b才引进的,是一个比port更简单而且更有效 ...

  2. 【erlang】吃螃蟹 rust 开发 erlang nif 的正确方式 rustler

    用rust编写erlang的nif方案,以下几个star比较高 Rustler ( https://github.com/hansihe/rustler ) 这个比较火,但是没有关于如何在 Erlan ...

  3. erlang nif 中文手册

    这是翻译erlang官方文档中的 erts-5.9.2的erl_nif部分.翻译完了.水平有限,我就把这个当作是我自己使用了,以后也会继续完善的. erlang nif 中文手册 概括 功能 初始化 ...

  4. Windows下使用NIF扩展Erlang方法

    在Erlang中,NIF(Native Implemented Function)被用来扩展erlang的某些功能,一般用来实现一些erlang很难实现的,或者一些erlang实现效率不高的功能. N ...

  5. Erlang NIF使用

    Erlang NIF使用 NIF库是Erlang源码里经常出现的东西,它像其他函数一样被调用,对调用方来说没区别,本身为C实现,效率较高,今天在Linux下测试一下NIF的自定义实现过程 在Erlan ...

  6. 在windows下编译erlang内建函数(nif)的dll文件

    1. 准备软件 python2.7X64安装包; gyp工具包; vs2013;python和gyp下载地址:链接: https://pan.baidu.com/s/1xXkkYi7HEgaUR_Mm ...

  7. Erlang NIF的使用

    Native Implemented Functions(NIF)可以用C来实现程序一些功能的扩展,一般用来实现一些用Erlang无法实现或者实现效率低的功能. C语言编译生成的动态库(*.so)在E ...

  8. Erlang NIF简析

    在Erlang调用C代码时,NIF(Native Implemented Function)是比port driver更简单和有效的实现方式,尤其是编写同步程序中,NIF是非常适合Erlang 的. ...

  9. protobuff的erlang nif封装

    服务器协议一直以来都使用erlang-protobuff,项目地址:https://github.com/ngerakines/erlang_protobuffs,但觉得效率不行,于是想优化一下,思路 ...

最新文章

  1. 设计模式系列3-----C++实现命令模式(Command Pattern)
  2. nginx中的event模块
  3. 如何评估深度学习模型效果?阿里工程师这么做
  4. 用Python玩转词云
  5. python日志汇总
  6. B4010 菜肴制作 拓扑排序(附随机跳题代码)
  7. 牛客第二场 G.League of Legends-单调队列优化dp
  8. notepad写php为什么不变色,【编程开发工具】notepad关键字不变色怎么办
  9. R语言聚类算法之期望最大化聚类(Expectation Maximization Algorithm)
  10. Unity Behaviors for Interception
  11. 数据结构 哈希表设计
  12. 入门物联网需要服务器
  13. 图书查找java_java图书信息查询实例
  14. goole搜索技巧(摘要)
  15. 网站HTML SEO优化
  16. 第七篇 indicators(2)指标的绘制
  17. CSS3 设置模糊背景图片
  18. Photoshop设计网站原型图
  19. 前端技术(7) : 省市区联动并设置默认值II
  20. 华硕笔记本A45V的bios密码取消设置

热门文章

  1. java arraylist lik_java 集合ArrayList及LinkList源码分析
  2. php amqp扩展安装,Linux下PHP扩展amqp安装
  3. 我的世界服务器文件夹作弊,我的世界快速抓获作弊玩家 服主必看
  4. APP图标尺寸规范一文了解清楚
  5. AspectJ 实现代理
  6. 【Android】播放音频的几种方式介绍
  7. mindjet mindmanager2021 v20.2.201 中文版如何创建制作思维导图教程分享
  8. 皮马印第安人糖尿病数据集——模型评估
  9. leapmotion设备连接Unity3D
  10. 基于STM32实现串口通信输出hello windows!