`
cwqcwk1
  • 浏览: 89219 次
文章分类
社区版块
存档分类
最新评论

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

#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

分享到:
评论

相关推荐

    Windows下使用NIF扩展Erlang完整例子

    Windows下使用NIF扩展Erlang完整例子,包含nif工程项目,erlang引用例子。 配套文章:http://blog.csdn.net/mycwq/article/details/17527485

    erl_nif 扩展erlang的另外一种方法

    标题"erl_nif 扩展erlang的另外一种方法"指出,本文将讨论如何使用erl_nif库来扩展Erlang的功能。erl_nif是Erlang/OTP系统中的一种机制,允许开发者用C语言编写底层代码,然后在Erlang虚拟机(EVM)中直接调用,从而...

    rustler编写erlang nif

    【描述】:在CSDN博主ap114的文章中,详细介绍了如何使用Rustler来创建Erlang的NIF。文章首先讲解了Erlang NIF的基本概念和用途,指出NIFs可以在Erlang VM中提供接近原生速度的性能,但同时也需要注意它们可能带来的...

    erlang nif test

    C代码需要包含Erlang VM提供的头文件,如`erl_nif.h`,并使用Erlang提供的API来操作Erlang术语(如erts-3.14/beam/erl_nif.h中的enif_make_int等)。 3. **加载NIF**:在Erlang模块的`load`函数中,使用`enif_open_...

    erl_nif_rustler_过程宏写法

    在Erlang中,`NIF (Native Implemented Functions)` 是一种机制,允许开发者使用其他语言(如C或Rust)编写高效性能的代码,并在Erlang虚拟机中调用。本篇主要介绍如何利用Rust语言来开发Erlang NIF,并探讨`erl_nif...

    rustler —用于创建Erlang NIF函数的安全Rust桥-Rust开发

    示例Rustler是一个用于以安全的Rust代码编写Erlang NIF的库。 这意味着应该没有任何办法。 入门指南 示例Rustler是一个用于以安全的Rust代码编写Erlang NIF的库。 这意味着应该没有办法使BEAM(Erlang VM)崩溃。 该...

    erlang版本的protobuf(erl_protobuffs)

    3. **集成性**:由于Erlang主要用于构建分布式系统,`erl_protobuffs`的设计考虑到了Erlang的通信模型,使得与其他Erlang进程的交互更为流畅,尤其适合处理大规模并发场景下的数据交换。 **使用erl_protobuffs** 1...

    luex:Nif在Erlang中运行Lua

    在Elixir / Erlang中运行lua 安装 如果,包装可以通过添加安装luex你在依赖列表mix.exs : def deps do [ { :luex , " ~&gt; 0.1.0 " } ] end 用法示例 { :ok , l} = Luex . init () Luex . dostring (l, " while...

    bitwise:用于显示Erlang调度程序问题的Erlang NIF示例

    按位:NIF示例显示Erlang调度程序的问题bitwise模块实现了几个Erlang本机实现函数(NIF),旨在显示NIF对Erlang调度程序线程可能产生的几种不同影响。 该模块提供的功能的几个变体exor/2采用一个二进制和一个字节值...

    erlang19安装包

    Erlang/OTP 19.1 is a service release containing mostly bug fixes, as well as a number of new features and characteristics improvements. Some highlights of the release are: erts: Improved dirty ...

    erlang port driver test

    Port Driver 可能与其他 Erlang 外部接口技术,如 NIF(Native Implemented Function)或 ETS(Erlang Term Storage)进行了对比。 标签 "erlang post driver test" 强调了测试的焦点是关于 Erlang 的 Port Driver...

    erlang-rust-nif:在 Rust 中实现的 Erlang NIF 示例

    Rust 中的 Erlang NIF 这是一个如何在 Rust 中实现 NIF 的示例。 它对我有用,也可能对你有用,但如果它吃掉了你的作业,请不要生气。 虽然这将是可行的写现实世界的代码下面这个例子,因为整个erl_nif.h接口可用...

    rustler:用于创建Erlang NIF函数的Safe Rust桥

    在Rustler的情况下,FFI是指Rust代码能够通过Erlang NIF与Erlang VM进行通信。 ElixirRust这个标签表明Rustler也支持Elixir项目,因为Elixir是构建在Erlang VM之上的现代函数式编程语言,它继承了Erlang的许多优点...

    高性能集群服务器Erlang解决方案

    - **异构系统粘合**:Erlang提供了多种接口(如NIF、JInterface等),便于与其他语言编写的应用程序进行交互。 #### Erlang的技术发展 近年来,Erlang社区一直在努力改进Erlang虚拟机,以适应新的硬件架构和技术...

    用于创建 Erlang NIF 函数的安全 Rust 桥

    盗贼文档|入门|例子Rustler 是一个用安全的 Rust 代码编写 Erlang NIF 的库。这意味着应该没有办法让 BEAM (Erlang VM) 崩溃。该库提供了用于生成与 BEAM 交互的样板的工具,处理 Erlang 术语的编码和解码,并在它们...

    erlpuzzle:Erlang NIF 到 libpuzzle,一个快速查找视觉相似图像的库

    ErlPuzzle - Erlang 的 libpuzzle NIF Puzzle 库旨在快速找到视觉上相似的图像(gif、png、jpg),即使它们已被调整大小、重新压缩、重新着色或稍微修改。 该库是免费的、轻量级的但非常快速、可配置、易于使用,...

    enif_protobuf:使用enif(Erlang nif)的Google Protobuf实现

    **enif_protobuf** 是一个基于 **Erlang NIF (Native Implemented Functions)** 的库,用于集成 **Google Protobuf**,使得在Erlang环境中能够方便地处理和序列化protobuf消息。Erlang NIF是一种机制,允许Erlang...

    USB.NIF可以解决硬件不能正常工作

    通常,系统驱动程序存储在C:\Windows\System32\DriverStore\FileRepository目录下,但直接将文件复制到C盘根目录也可能有效,尤其是在紧急修复的情况下。 3. 打开设备管理器,找到有问题的USB设备,右键点击并选择...

    erlang-tc:Erlang NIF用于threshold_crypto

    测试对于验证NIF的正确性和安全性至关重要,因为不当使用NIFs可能会导致Erlang进程崩溃,影响整个系统的稳定性。 在`erlang-tc-main`这个文件中,很可能包含了项目的主模块或者核心代码。可能包括以下部分: - **...

Global site tag (gtag.js) - Google Analytics