2015-09-29 33 views
1

我想用C++編寫一些使用SWIG與JAVA接口的庫。SWIG:使用導入的外部類型

我在另一個庫的一個C++函數中使用了一個庫中的一個C++結構作爲參數。

COMMON.H

namespace rina { 
    namespace cdap_rib { 
     typedef struct{ 
     int size_; 
     void* message_; 
     } ser_obj_t; 
    } 
} 

該庫被包裹產生在JAVA稱爲eu.irati.librina.ser_obj_t類。沒關係。然後,我有

utilities.h

class IPCPConfigEncoder { 
    public: 
     void encode (rina::cdap_rib::ser_obj_t& ser_obj); 
} 

其包梁與SWIG在Java類生產

public void encode(SWIGTYPE_p_rina__cdap_rib__ser_obj_t ser_obj) { 
    ... 
} 

。展望我發現身邊(SWIG Importing generated class from a different module and package into the current class),我加入到.i

%typemap(javaimports) SWIGTYPE 
%{ 
    import eu.irati.librina.ser_obj_t; 
%} 

它生產

import eu.irati.librina.ser_obj_t; 
public void encode(SWIGTYPE_p_rina__cdap_rib__ser_obj_t ser_obj) { 
    ... 
} 

然後,我有幾個問題

  1. import被添加到所有的java類......我怎樣才能把它只包含到所需的類?

  2. 如何告訴SWIG更改SWIGTYPE_p_rina__cdap_rib__ser_obj_teu.irati.librina.ser_obj_t

注:由於common.hutilities.h在不同的圖書館,我不能把它們放在一起一樣痛飲模塊中。

+0

請問我的例子utilities.h在:http://stackoverflow.com/a/30413268/168175爲你解決這個問題? – Flexo

+0

好,問題在於兩者都是放在不同文件夾中的不同模塊。當我導入其他.i時,它找不到包含,因爲它似乎都必須位於同一個文件夾中。 – Bernat

+0

您可以使用-I標誌來SWIG設置包含搜索路徑。 – Flexo

回答

0

正如@Felxo指出的那樣,唯一的解決方案是告訴swig理解其他庫接口的封裝(所以標頭以及它們是如何封裝的)。

我做了什麼:

  1. 我複製到common.i公用事業包裝的文件夾。
  2. 我加入utilities.i

    /* this is the "copied" common.i */ 
    %import "common.i" 
    %pragma(java) jniclassimports=%{ 
    import eu.irati.librina.ser_obj_t; 
    %} 
    

    添加代理類的進口(你應該改變泰國人從java路徑指向您的代理類)

  3. 從複製的common.i中刪除像%template這樣的不必要的指令,請記住,在這一點上,你只是「導入」common.h,而不是包裝它(你之前已經包裝了它)。其實,common.i只應包括:

    %{ 
        #include "common.h" 
    }% 
    

    但沒有

    %include "common.h" 
    
  4. 告訴痛飲哪裏是common.h以及在哪裏使用-I選項