使用SWIG实现C/C++与其他语言间的互相调用

 
为了运行速度,java, C#, ruby等语言可能会调用C/C++写的函数或者类,但直接写很麻烦,必须遵循各种语言订立的规范,以jni为例要导出一个函数给java用,你必须在函数定义前写上 JNIEXPORT,对于那些早已存在的代码,这样就麻烦了,而且相同的代码如果要给ruby用,又得按照扩展Ruby的规定去重新定义这些函数。并且不能将C++定义的类直接拿来用
但SWIG能很方便,很自然的将C/C++代码转换给这些语言用。
要使用swig需要到 www.swig.org去下载这个工具。
以ruby为例,讲讲用法。
首先下载ruby, 我的是1.8.5, 运行configure.bat生成Makefile文件,再用nmake命令生成config.h文件和需要的静态库
用vs2005新建一个动态库工程
//Test.h
class TestRuby
{
public :
   TestRuby();
 
    void print();
};
 
void testFun();
 
//Test.cpp
#include "test.h"
 
#include <iostream>
 
using namespace std;
 
TestRuby::TestRuby()
{
    cout<<"Test::Test/n";
}
 
void TestRuby::print()
{
    cout<<"hello swig/n";
}
 
void testFun()
{
    cout<<"testFun/n";
}
//Test.i
%module test
 
%{
    #include "test.h"
%}
 
%include "test.h"
注意include前的是%,昨天看成#,害得白忙了半天,汗
建立一个空白文件test_wrap.cxx
设置好环境变量,运行
swig c++ -ruby test.i
(也可以在项目属性中的自定义生成步骤中定义这些命令,具体见MSDN)
这时会更新test_wrap.cxx文件
自动生成ruby调用C函数需要的一些东东
如:
SWIGEXPORT void Init_test(void) {
 size_t i;
 
 SWIG_InitRuntime();
 mTest = rb_define_module("Test");
 
 SWIG_InitializeModule(0);
 for (i = 0; i < swig_module.size; i++) {
    SWIG_define_class(swig_module.types[i]);
 }
 
 SWIG_RubyInitializeTrackings();
 
 cTestRuby.klass = rb_define_class_under(mTest, "TestRuby", rb_cObject);
 SWIG_TypeClientData(SWIGTYPE_p_TestRuby, (void *) &cTestRuby);
 rb_define_alloc_func(cTestRuby.klass, _wrap_TestRuby_allocate);
 rb_define_method(cTestRuby.klass, "initialize", VALUEFUNC(_wrap_new_TestRuby), -1);
 rb_define_method(cTestRuby.klass, "print", VALUEFUNC(_wrap_TestRuby_print), -1);
 cTestRuby.mark = 0;
 cTestRuby.destroy = (void (*)(void *)) free_TestRuby;
 cTestRuby.trackObjects = 0;
 rb_define_module_function(mTest, "testFun", VALUEFUNC(_wrap_testFun), -1);
}
在附加包含目录中引入ruby.h所在的那个路径
在链接器中把需要的库附加进去,我这里链接的是msvcrt-ruby18.lib
编译,生成dll
 
写个ruby文件测试
require 'test'
 
t = Test::TestRuby.new()
t.print
 
Test.testFun
 
正确输出
Test::Test
Hello swig
testFun
 
如果要把这个代码给java,或C#用只要改变一下swig的命令参数,然后再编译一次就行了,异常方便
Swig不支持C++所以特性,但常用的特性都支持,不太影响使用。
Swig支持C#, java, Lua, Ruby, Perl, Python, Tcl等多种语言
 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值