文藝一點總結(jié),SWIG就是C/C++類庫與泛高階語言的萬能粘合劑。
按照Swig的思路,C/C++是很優(yōu)秀的library級代碼語言,而寫界面等方面則是Java、C#、Python們占優(yōu)。所以SWIG(Simplified Wrapper and Interface Generator) 就把C/C++寫的類庫,編譯為上述高階語言的Class來使用。
原本擔心這個項目有點邊緣化,一看原來Ruby和Python早就靠它從C/C++里溜東西出來了。對于python, ruby這些家底不厚的新生代來說,C/C++的類庫很有魅惑力。
cyt偶像說,"做產(chǎn)品的時候好呀:有豐富的API接口,支持java、python、php、perl、ruby…… 多好吹…… "
1. 實現(xiàn)原理:
比如Java吧,有一個JNI機制可以直接調(diào)用C代碼,但要求C代碼需如是:
{
printf("Hello world!\n");
return;
}
SWIG 就為你自動生成了這個冗長的wrapper文件,其中還妥善完成了類型轉(zhuǎn)換,函數(shù)指針、模板這些C++功能在其他語言中的轉(zhuǎn)換等諸般工作,善舉阿。
2.操作過程:
很簡單,特別在VC里dsp文件都寫好了,把選項設為Release,rebuild一下就搞定。
如果要拆成慢動作,在一個Java項目里是這樣的:
1.編寫interface文件example.i
如果api有頭文件就更簡單了,下面的代碼定義一個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
int g = new Example().add(42,105);
3.總結(jié)
當你山窮水盡,準備要重新發(fā)明輪子的時候,總該想起有個swig,可以把C/C++的輪子,換裝到你的語言上。