[Erlang]如何使用NIF

在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 plain copy 在CODE上查看代码片 派生到我的代码片
  1. #ifdef _WIN32  
  2. #   define WIN32_LEAN_AND_MEAN  
  3. #   include <Windows.h>  
  4. #   pragma comment(lib, "erts_MD.lib")  
  5. #endif  
  6.   
  7. #include "erl_nif.h"  
  8.   
  9. static ERL_NIF_TERM hello(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])  
  10. {  
  11.     return enif_make_string(env, "Hello world!", ERL_NIF_LATIN1);  
  12. }  
  13.   
  14. static ErlNifFunc nif_funcs[] =  
  15. {  
  16.     {"hello", 0, hello}  
  17. };  
  18.   
  19. ERL_NIF_INIT(niftest,nif_funcs,NULL,NULL,NULL,NULL)  

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

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. /********  无情的分割线 ********* /    
  2.   作者:没有开花的树    
  3.   博客:blog.csdn.net/mycwq    
  4. / *******   无情的copy  *********/     

三、在erlang中使用NIF库

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

[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. -module(niftest).    
  2. -export([init/0, hello/0]).    
  3.     
  4. init() ->    
  5.     erlang:load_nif("./niftest", 0).  
  6.     
  7. hello() ->    
  8.     "this function is not defined!".   
2、运行erlang代码
[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. 1>c(niftest).  
  2. {ok,niftest}  
  3.   
  4. 2> niftest:hello().  
  5. this function is not defined!  
  6.   
  7. 3> niftest:init().  
  8. ok  
  9.   
  10. 4> niftest:hello().  
  11. "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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值