用C++写ruby扩展

转载 2012年03月22日 23:18:45

用C++写ruby扩展

为了测试CDMA短信的发送方便,于是想到编译成lib,提供ruby使用。

SmsObject.h:
void SendSms(const char* msg, const char* number, char* out);

main.cpp:

//
// by deli 2009.6.11
//
#include <ruby.h>
#include "SmsObject.h"

static VALUE makepdu(VALUE self, VALUE arg1, VALUE arg2) {
    VALUE s;
    char pdu[512] = {0};
    char* msg = RSTRING(arg1)->ptr;
    char* number = RSTRING(arg2)->ptr;

    SendSms(msg, number, pdu);
    s = rb_str_new2(pdu);

    return s;
}

extern "C"
void __declspec(dllexport) Init_sms() {
    VALUE myModule = rb_define_module("CDMA");

    VALUE myClass =
        rb_define_class_under(myModule, "SMS", rb_cObject);

    int arg_count = 2;
    rb_define_method(myClass, "makepdu", RUBY_METHOD_FUNC(makepdu), arg_count);
}

注意: C++要加上RUBY_METHOD_FUNC, C不用加。不然就会出现类似的错误:
error C2664: ‘rb_define_method’ : cannot convert parameter 3 from
‘unsigned long (unsigned long,unsigned long,unsigned long)’ to ‘unsigned long (_
_cdecl *)(…)’
None of the functions with this name in scope match the target type

test.rb:

#!/usr/bin/ruby 

require 'sms'

include CDMA

obj = SMS.new
pdu = obj.makepdu('什么都可以想,什么都可以不想,便觉得是个自由的人', '15338896034')

puts pdu

D:\Ruby\ruby-serial\sms>ruby test.rb
0000021002040702c54ce225a8d008420003200000013220c27602724487ea9f7a772b079ff86276
02724487ea9f7a772a706b079ff8627dfc4e4afcbb317a71540f53a98bb42275d00501a70801c00d
0101

大概就是这样。



早年写过用C++ + SWIG写Ruby插件的文,但实际中还是以原生C++写Ruby扩展,因为也相当简单。但长久没用还是会忘记,不得不翻以前的老代码回忆,写下这篇博文,若下次再忘记,也不至于去翻仓库。

建立 extconf.rb

require 'mkmf'

$libs = '-lstdc++'
create_makefile 'foo'
建立 foo.cc
#include <ruby.h>

VALUE plus(VALUE self, VALUE va, VALUE vb)
{
	int a = NUM2INT(va);
	int b = NUM2INT(vb);

	return INT2NUM(a+b);
}

extern "C" void Init_foo()
{
	VALUE foo = rb_define_module("Foo");
	rb_define_module_function(foo, "plus", RUBY_METHOD_FUNC(plus), 2);
}
生成扩展 foo.so
$ ruby extconf.rb
$ make
# 如果要安装至site-ruby
$ make site-install
测试文件 test.rb
require 'foo.so'

puts Foo.plus(3,4)
$ ruby test.rb
7

MDA框架生成代码流程和图例(UML 正向工程,支持Java, C#, Ansi C++, Delphi, Perl, Php5, Python, Database,Ruby, Hibern)

Trufun产品提供基于通用MDA代码生成框架的生成语言实现:目前已经支持Java, C#, Ansi C++, Delphi, Perl, Php5, Python, Database,Ruby,H...

大牛谈各种语言 包括c/c++/java/python/ruby/lisp/perl ​​​

通天塔导游(译注:圣经记载:在远古的时候,人类都使用一种语言,全世界的人决定一起造一座通天的塔,就是巴别塔,后来被上帝知道了,上帝就让人们使用不同的语言,这个塔就没能造起来。 巴别塔不建自毁,与其说上...
  • apengg
  • apengg
  • 2017年02月10日 10:42
  • 391

C++/C#/F#/Java/JS/Lua/Python/Ruby渲染比试

512x512像素,每像素10000个采样,intel c++ openmp版本渲染时间为18分36秒。估计ruby版本約需351天。 前篇博文把一个c++全局光照渲染器移植至c#,比较c++和c#...

Java、C++、Python、Ruby、PHP、C#和JavaScript的理解

Java、C++、Python、Ruby、PHP、C#和JavaScript和日本动漫里的那些大家熟悉的动漫人物结合起来,根据他们的身世、个人经历来生动的表达各编程语言的发展历程。原文内容如下:  ...

【转】amazon的一个大牛谈各种语言,包括c、c++、java、python、ruby、lisp、perl 中文版

#title Tour De Babel  通天塔导游  (译注:圣经记载:在远古的时候,人类都使用一种语言,全世界的人决定一起造一座通天的塔,就是巴别塔,后来被上帝知道了,上帝就让人们使...

amazon的一个大牛谈各种语言,包括c、c++、java、python、ruby、lisp、perl

#title Tour De Babel 通天塔导游 (译注:圣经记载:在远古的时候,人类都使用一种语言,全世界的人决定一起造一座通天的塔,就是巴别塔,后来被上帝知道了,上帝就让人们使用不同的语言...

amazon的一个大牛谈各种语言,包括c、c++、java、python、ruby、lisp、perl 中文版

通天塔导游 (译注:圣经记载:在远古的时候,人类都使用一种语言,全世界的人决定一起造一座通天的塔,就是巴别塔,后来被上帝知道了,上帝就让人们使用不同的语言,这个塔就没能造起来。 巴别塔不建自毁,...

<转> amazon的一个大牛谈各种语言 c c++ java python ruby lisp perl

这是我写的旋风式的编程语言简介—我本来为亚马逊开发者杂志本月的期刊写的,但是发现我写的东西没法…见人。 首先,我偶尔一不小心口出脏话,或者对上帝不恭的话,所以对很官方很正式的亚马逊上发表是不合适...

[CoffeeScript]图解C++、CoffeeScript 和 Ruby 的复杂度

大多数人都同意C++是门相当复杂的语言,不过它究竟有多复杂?由于好奇心作祟,我比较了C++、CoffeeScript、Ruby这几门语言的必学功能作为复杂程度评判的标准。虽然CoffeeScrip...

YAML简介及应用(c/c++ 和 ruby)

http://www.ibm.com/developerworks/cn/xml/x-1103linrr/ 官网语法:http://www.yaml.org/refcard.html YAML 作...
  • bytxl
  • bytxl
  • 2014年02月14日 11:39
  • 2242
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用C++写ruby扩展
举报原因:
原因补充:

(最多只允许输入30个字)