参考文章:http://www.cnblogs.com/cobbliu/archive/2012/03/10/2388557.html
cprime.c
#include <stdbool.h>
#include <math.h>
#include <string.h>
#include "erl_nif.h"
static bool is_prime(int i)
{
int j;
int t = sqrt(i) + 1;
for (j = 2; j <= t; ++j)
{
if (i % j == 0)
{
return false;
}
}
return true;
}
static ERL_NIF_TERM find_prime(ErlNifEnv* env, int argc, ERL_NIF_TERM argv[])
{
int n;
if (!enif_get_int(env, argv[0], &n))
{
return enif_make_badarg(env);
}
else
{
int i;
ERL_NIF_TERM res = enif_make_list(env, 0);
for (i = 2; i < n; ++i)
{
if (is_prime(i))
{
res = enif_make_list_cell(env, enif_make_int(env, i), res);
}
}
return res;
}
}
static ErlNifFunc nif_funcs[] =
{
{"find_prime", 1, find_prime}
};
ERL_NIF_INIT(prime, nif_funcs, NULL, NULL, NULL, NULL)
win下mingw编译
gcc cprime.c -o cprime.dll -shared -I"D:\Program Files\erl5.10.4\erts-5.10.4\include"
linux下gcc编译
[root@test erlang]# gcc cprime.c -o cprime.so -fPIC -shared -I/usr/local/erlang180/lib/erlang/erts-7.0/include/
prime.erl
-module(prime).
-on_load(init/0).
-export([
find_prime/1
]).
init() ->
erlang:load_nif("./cprime", 0).
find_prime(N) ->
io:format("This function is not defined!~n").
win下测试
F:\JSKP\study\lang\erlang\test>gcc cprime.c -o cprime.dll -shared -I"D:\Program Files\erl5.10.4\erts-5.10.4\include"
cprime.c:53:5: warning: initialization from incompatible pointer type
{"find_prime", 1, find_prime}
^
cprime.c:53:5: warning: (near initialization for 'nif_funcs[0].fptr')
F:\JSKP\study\lang\erlang\test>erlc prime.erl
f:/JSKP/study/lang/erlang/test/prime.erl:15: Warning: variable 'N' is unused
F:\JSKP\study\lang\erlang\test>erl
Eshell V5.10.4 (abort with ^G)
1> prime:find_prime(90).
[89,83,79,73,71,67,61,59,53,47,43,41,37,31,29,23,19,17,13,
11,7,5,3]
2>