SWIG,把C/C++ API 導出成Java,C#,Python,Ruby,Php的類庫

 

    文藝一點總結,SWIG就是C/C++類庫與泛高階語言的萬能粘合劑。
   按照Swig的思路,C/C++是很優秀的library級代碼語言,而寫界面等方面則是Java、C#、Python們佔優。所以SWIG(Simplified Wrapper and Interface Generator) 就把C/C++寫的類庫,編譯爲上述高階語言的Class來使用。
    原本擔心這個項目有點邊緣化,一看原來Ruby和Python早就靠它從C/C++裏溜東西出來了。對於python, ruby這些家底不厚的新生代來說,C/C++的類庫很有魅惑力。
    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 就爲你自動生成了這個冗長的wrapper文件,其中還妥善完成了類型轉換,函數指針、模板這些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 g = new Example().add(42,105);


  3.總結
    當你山窮水盡,準備要重新發明輪子的時候,總該想起有個swig,可以把C/C++的輪子,換裝到你的語言上。

發佈了9 篇原創文章 · 獲贊 2 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章