文藝一點總結,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++的輪子,換裝到你的語言上。
三軍未動,資料先行。書山碟海,只列其中最好的。統統都可以emule找到。
1.快速入門
〈Accelerated.C++〉2000
〈Essential C++〉2002 Lipman
兩本都是開篇就講C++/STL,絕口不提C,而且都有中文版。
2.枕頭參考 〈C++.Primer.4th〉2005 Lippman,第3版有中文版,當入門書看也無不可。
〈The.C++.Programming.Language.3rd〉Bjarne Stroustrup ,簡稱TCPL。
3.專門書籍
STL參考:
〈The.C++.Standard.Library-A.Tutorial.And.Reference〉1999
號稱最好的STL參考,但我覺得很像JDK文檔。
Boost 參考:
〈Beyond the C++ Standard Library - An Introduction to Boost〉2005
介紹了Boost的一些重要類庫,但其余的還是要看Boost自帶文檔。
C++ Template參考:
〈C++ Templates - The Complete Guide〉2002
對template講得相當深,無愧于The Complete Guide的書名,ytam說可以作為MCD的前傳和續集。
〈C++ Common Knowledge〉 中文版, Stephen C. Dewhurst
跑杯茶怡然的看看C++里面那些值得吹噓的知識點是個不錯的場景。
4.Effective 類 Herb Sutter, Andrei Alexandrescu合著一本:
〈C++.Coding.Standards - 101.Rules.Guidelines〉2004
Meyers的三本Effecive:
〈Effective C++ 3rd〉 2005
〈More Effective C++〉 〈Effective.STL.50.Specific.Ways.to.Improve.Your.Use.of.STL〉 〈C++ Gotchas〉2002,Stephen C. Dewhurst
對于后四本,我老覺得是在語言規范下繞來繞去,從工作角度來看是實用,從個人角度看來是無聊。
5.精力過剩類 〈Modern C++ Design - Generic Programming and Design Patterns 〉2001 Andrei Alexandrescu ,推薦,C++里最值得一讀的書。
〈C++ Template Metaprogramming Concepts,Tools and Techniques from Boost and Beyond 〉 Herb Sutter的三本Exceptional,rayman說是打擊信心用的:
〈Exceptional C++ - 47 Engineering Puzzles, Programming Problems, and Solutions 〉1999
〈More Exceptional C++〉2001
〈Exceptional C++ Style - 40.New.Engineering.Puzzles.Programming.Problems.and.Solutions〉2004