2011-11-29 103 views
1

我有我通過SWIG暴露在我的Java二層C函數,並均與一個const void *的數據類型(「VAL)的輸入參數是必須爲addCategory功能uint8_t但對於功能的addAttribute一個字符。我目前在SWIG接口文件,使用%適用於映射常量無效* C類型爲短在Java端。有修改SWIG接口文件的方式來從頭文件同時支持一個char(字符串)和用於常量無效*輸入參數uint8_t(短)使用SWIG申請相同的C數據類型多種Java數據類型

C函數:

int 
addCategory(query_t *query, type_t type, const void *val); 

int 
addAttribute(query_t *query, type_t type, const void *val); 

痛飲接口文件:

%module Example 
%include "stdint.i" 
void setPhy_idx(uint32_t value); 
%include "arrays_java.i" 
void setId(unsigned char *value); 
%{ 
#include "Example.h" 
%} 
%apply char * { unsigned char * }; 
%apply char * { void * }; 
%apply uint8_t { const void * } 
%apply int32_t { int32_t * } 
%include "Example.h" 

回答

0

你不能直接這樣做 - 什麼類型會在這個地方在Java中使用嗎?您需要幫助SWIG以某種方式做出決定。

你(至少)三種可能的解決方案:

  1. 使用類型層次 - 基類型將是功能需要什麼,子類將得到裹也。你可以這樣做在C++側,或使用痛飲的類型映射設施在Java的一面。我認爲這是不必要的複雜,所以我在這裏沒有舉出一個例子。
  2. 使用過載(甚至是不同的功能,具有完全不同的名字 - 你可以使用%rename,使它們放回在Java中重載,即使他們在C不同的名稱)
  3. 使用union。這將痛飲得到包裹着setget功能:

    %module test 
    
    union values { 
        unsigned char *string; 
        void *generic; 
        uint8_t someOtherThing; 
        uint32_t number; 
    }; 
    
    void func(values v); 
    

    這導致所謂values一個Java類,它func()需要,可以通過工會的成員之一通過。顯然,你要爲union成員%apply適當typemaps。