zoukankan      html  css  js  c++  java
  • Windows下使用NIF扩展Erlang方法

    在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.2erts-5.10.2include

    erl静态库:erl5.10.2erts-5.10.2lib,静态库这里只用到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

  • 相关阅读:
    jQuery Querystring
    BCP 导出文本到文件
    ASP.NET MVC实践系列12表单处理(转)
    with(nolock) 解释 SQL
    DevServer
    静态语言、动态语言、强类型语言、弱类型语言
    @符号惹的祸
    洛谷 题解 P4198 【楼房重建】
    题解 P2668 【斗地主】
    题解 P3620 【[APIO/CTSC 2007]数据备份】
  • 原文地址:https://www.cnblogs.com/fuhaots2009/p/3503203.html
Copyright © 2011-2022 走看看