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

news/2024/11/14 16:18:46

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


使用SWIG实现C/C++与其他语言间的互相调用   <script src="http://blog.csdn.net/count.aspx?ID=1714946&Type=Rank"></script>    CSDN Blog推出文章指数概念,文章指数是对Blog文章综合评分后推算出的,综合评分项分别是该文章的点击量,回复次数,被网摘收录数量,文章长度和文章类型;满分100,每月更新一次。    CSDN Blog推出文章指数概念,文章指数是对Blog文章综合评分后推算出的,综合评分项分别是该文章的点击量,回复次数,被网摘收录数量,文章长度和文章类型;满分100,每月更新一次。
 
为了运行速度,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等多种语言
 

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1714946


http://www.niftyadmin.cn/n/4819039.html

相关文章

Windows下配置ChromeDriver

1、查看自己chrome浏览器的版本。 浏览器地址栏输入以下地址 chrome://version 2、通过自己的版本下载相应的chromedriver.exe 下载地址&#xff1a;http://npm.taobao.org/mirrors/chromedriver/ 3、将下载下来的chromedriver.exe放在chrome安装目录下。我的安装目录是&#x…

LUA相关工具资源

http://bbs.pspchina.net/viewthread.php?tid213488 LUA相关工具资源[转] 出处http://www.blogcn.com/u2/43/78/qiyuan726/index.htmlLua IDE http://www.gorlice.net.pl/~rybak/luaide Windows平台Lua的整合开发环境 wxLua http://www.luascript.thersgb.net/ Lua and wxWidg…

面试题收集,面试和被面试中煎熬~~

面试题 C#面试基础问题 asp.net面试试题收集经典推荐--.Net面试法宝&#xff08;面试题收集&#xff09; ASP.NET面试的题目 C# msdn参考 (荐) 转载于:https://www.cnblogs.com/syveen/archive/2006/06/09/421751.html

使用LuaPlus在C++项目中集成Lua脚本

使用LuaPlus在C项目中集成Lua脚本 2008-07-16 00:02花了两天时间&#xff0c;费了好大的功夫才实现了C&#xff0b;&#xff0b;项目中集成Lua脚本的可行性分析。下面的工作就是去写脚本了&#xff0c;在写脚本之前先把C集成Lua的经验总结一下。 目前能实现C集成Lua的有很多。比…

csharp: json to csharp

http://json2csharp.com/ http://jsonclassgenerator.codeplex.com/ http://jsonutils.com/ JSON生成类文件 https://github.com/bladefist/JsonUtils /// http://jsonlint.com/ 检测JSON文件 http://json.codeplex.com/ https://www.mssqltips.com/sqlservertip/3449/making-s…

2.2 CPU 上下文切换是什么意思?(下)

怎么查看系统的上下文切换情况 过多的上下文切换&#xff0c;会把 CPU 时间消耗在寄存器、内核栈以及虚拟内存等数据的保存和恢复上&#xff0c;缩短进程真正运行的时间&#xff0c;成了系统性能大幅下降的一个 元凶。 使用 vmstat 这个工具&#xff0c;来查询系统的上下文切换…

在C++中集成Lua脚本(LuaWrapper )

在C中集成Lua脚本出处 在C中集成Lua脚本作者&#xff1a; 沐枫 &#xff08;第二人生成员&#xff09;版权所有转载请注明原出处主页&#xff1a;第二人生 http://www.d2-life.com   http://www.d2-life.com/LBS/blogview.asp?logID41为什么要用Lua作脚本&#xff1…

求最大连续子序列和

题目描述&#xff1a; 数组 int a[] {-4 , 3 ,56 , -15 , 34 , 0 , -14 , 4} ; 某几个连续的子序列其和最大&#xff0c;比如a0a1 -1 。a1a2a3a4 78 。则[a1 a2 a3 a4]组成的数组即是所求。 分析&#xff1a; 如果能够找到每个位置结束的最大连续子串和&#xff0c;那么保留…