SWIG,C/C++類庫與Java,Python等泛高階語言的萬能粘合劑

來源:互聯網
上載者:User

  原文出處及討論: 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++的輪子,換裝到你的語言上。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.