按照SWIG的思路,C/C++是很優秀的library級代碼語言,而寫界面等方面則是Java、C#、Python們占優。所以,swig讓你可以在高階語言里調用C/C++寫的類庫,并且不是簡單的跨語言調用,而是把類庫編譯為宿主語言里Class這樣的一等公民。
原本擔心這個項目有點邊緣化,一看原來Ruby和Python早就靠它從C/C++里溜東西出來了。對于python, ruby這些家底不厚的新生代來說,C/C++的類庫很有魅惑力。即使是富得不行的Java,也靠swig為SDL搞了個java版。
1. 實現原理:
比如Java吧,有一個JNI機制可以直接調用C代碼,但要求C代碼需如是:
SWIG(Simplified Wrapper and Interface Generator) 為你自動生成了這個冗長的wrapper文件和相應的Java類,其中還妥善完成了類型轉換,函數指針、模板這些C++功能在其他語言中的轉換等諸般工作,善舉阿。
2.操作過程:
很簡單,特別在VC里dsp文件都寫好了,把選項設為Release,rebuild一下就搞定。
如果要拆成慢動作,在一個Java項目里是這樣的:
1.編寫interface文件example.i
如果api有頭文件就更簡單了,下面的代碼定義一個example類
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
3.總結
當你山窮水盡,準備要重新發明輪子的時候,總該想起有個swig,可以把C/C++的輪子,換裝到你的語言上。
原本擔心這個項目有點邊緣化,一看原來Ruby和Python早就靠它從C/C++里溜東西出來了。對于python, ruby這些家底不厚的新生代來說,C/C++的類庫很有魅惑力。即使是富得不行的Java,也靠swig為SDL搞了個java版。
1. 實現原理:
比如Java吧,有一個JNI機制可以直接調用C代碼,但要求C代碼需如是:
JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj)
{
printf("Hello world!\n");
return;
}
{
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"
%{
#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);
int i = new Example().add(42,105);
3.總結
當你山窮水盡,準備要重新發明輪子的時候,總該想起有個swig,可以把C/C++的輪子,換裝到你的語言上。
[引用提示]hawkxjy引用了該文章, 地址: http://blog.csdn.net/hawkxjy/archive/2005/10/25/516550.aspx
思考ing……
科學最重要,而不是技術!!!
至于那些只會去學習別人東西的人,那就是垃圾,我明天就寫一個比那個更好的給你看看
科學是什么?科學==nothing