SWIG,C/C++类库与Java,Python等泛高阶语言的万能粘合剂

最近开始研究opencv在android的应用,安装的发现需要装一个叫swig的东东. 文章转载自 http://www.blogjava.net/calvin/archive/2005/10/24/16606.html


  按照SWIG的思路,C/C++是很优秀的library级代码语言,而写界面等方面则是Java、C#、Python们占优。所以,swig让你可以在高阶语言里调用C/C++写的类库,并且不是简单的跨语言调用,而是把类库编译为宿主语言里Class这样的一等公民。
    原本担心这个项目有点边缘化,一看原来Ruby和Python早就靠它从C/C++里溜东西出来了。对于python, ruby这些家底不厚的新生代来说,C/C++的类库很有魅惑力。即使是富得不行的Java,也靠swig为SDL搞了个java版
   cyt偶像说,"做产品的时候好呀:有丰富的API接口,支持java、python、php、perl、ruby…… 多好吹…… "
   
1. 实现原理:
    比如Java吧,有一个JNI机制可以直接调用C代码,但要求C代码需如是:

JNIEXPORT  void  JNICALL Java_HelloWorld_displayHelloWorld(JNIEnv  * env, jobject obj) 
{
    printf(
" Hello world!\n " );
    
return ;
}

   SWIG(Simplified Wrapper and Interface Generator) 为你自动生成了这个冗长的wrapper文件和相应的Java类,其中还妥善完成了类型转换,函数指针、模板这些C++功能在其他语言中的转换等诸般工作,善举阿。

  2.操作过程:  
    很简单,特别在VC里dsp文件都写好了,把选项设为Release,rebuild一下就搞定。
    如果要拆成慢动作,在一个Java项目里是这样的:
   1.编写interface文件example.i
     如果api有头文件就更简单了,下面的代码定义一个example类
  
% module example
% {
#include 
" example.h "
% }
% include  " example.h "

    2.   swig -java  example.i   
     生成符合JNI语法(见上)的C文件: example_wrap.c
     生成Java类文件:exampleJNI.java,example.java

    3.VC把example_wrap.c 和example.c 打包成dll. 

    4.在普通java程序里使用example.java
 
      System.loadLibrary( " example " );
      
int  i  =   new  Example().add( 42 , 105 );

  3.总结
     当你山穷水尽,准备要重新发明轮子的时候,总该想起有个 swig ,可以把C/C++的轮子,换装到你的语言上。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值