erlang调用c\c++动态链接库

之前的服务器用c++写的,有一个加密库要在erlang中使用,正好来了解一下erlang nif模块

下面是简单的例子。
1、vs新建一个空白的c++工程名字就叫niftest
2、把ERL_ROOT/usr/include目录复制到niftest工程目录里
3、右键项目属性-》常规-》配置类型-》动态库(.dll)
4、右键项目属性-》常规-》字符集-》使用Unicode字符集
5、右键项目属性-》VC++目录-》包含目录-》把复制过来的include目录添加上
6、新建niftest.c和complex.c文件,如下内容

/*niftest.c*/
#include "erl_nif.h"

extern int foo(int x);
extern int bar(int y);

static ERL_NIF_TERM foo_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{
    int x, ret;
    if (!enif_get_int(env, argv[0], &x)) {
        return enif_make_badarg(env);
    }
    ret = foo(x);
    return enif_make_int(env, ret);
}

static ERL_NIF_TERM bar_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{
    int y, ret;
    if (!enif_get_int(env, argv[0], &y)) {
        return enif_make_badarg(env);
    }
    ret = bar(y);
    return enif_make_int(env, ret);
}

static ErlNifFunc nif_funcs[] = {
    { "foo", 1, foo_nif },
    { "bar", 1, bar_nif }
};

ERL_NIF_INIT(niftest, nif_funcs, NULL, NULL, NULL, NULL)
/*complex.c*/
int foo(int x) {
    return x + 1;
}

int bar(int y) {
    return y * 2;
}

7、右键项目生成
8、新建erlang项目,把生成出来的niftest.dll复制到erlang项目中
9、新建一个niftest.erl文件,如下内容

-module(niftest).
-export([init/0, foo/1, bar/1]).

init() ->
  erlang:load_nif("./niftest", 0).

foo(_N) ->
  "foo function is not defined!".

bar(_N) ->
  "bar function is not defined!".

10.执行如下内容

>erl
1>c(niftest.erl).
2>ok.
3>niftest:foo().
"foo function is not defined!"
4>niftest:init().
ok.
5>niftest:foo(10).
11
6>niftest:bar(10).
20

参考

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

你可能感兴趣的:(erlang-nif,Erlang)