2013-10-30 72 views
2

我有一個C函數像這樣的:痛飲,無法創建類型映射爲長*

int make_call(char* to, int *call_id); 

和一個非常簡單的接口文件:

%include "typemaps.i" 
%include "enums.swg" 
%include "arrays_java.i" 

%header %{ 
#include <my_header.h> 
%} 

/* Map "int*" as input & output */ 
%apply int *INOUT { int * }; 

這一切正常。在我的SWIG文件中,我得到: public static int make_call(String to,int [] call_id){..} 我可以使用一個元素調用它創建一個int []。迄今爲止都很好。

然而,隨着CALL_ID可它需要很長的,所以我改變了這個C API中,我加入到.i文件這一行相當大:

%apply long *OUTPUT { long * }; 

我嘗試了好幾種變體,包括試圖在SWIG中的java.html文檔中應用所描述的內容,但我總是最終生成一個int [] beeing,或者可能是我無法從Java中使用的swigtype。我只是無法讓它產生我期待的很長的[]。

我試着只是使其成爲一個雙這樣的:

%apply double *OUTPUT { double * }; 

,它按預期工作,我得到我的雙[]中生成的接口CALL_ID。

長型有什麼缺陷嗎?這看起來很奇怪嗎?

+0

我想這取決於你的架構。 'long'也可以是32位的'int'。你有沒有嘗試'長'?或者更好'uint64_t'和'uint32_t'?您可以檢查stdint.h的結構,8字節整數應該是多少。 – Bort

+0

這是目前爲Android的,但C API必須跨平臺,所以我不知道如果我在這裏用正確的方向使用很長時間? – user1816142

+0

我不知道Android是否完全支持C99標準,如果它確實比uint64_t在stdint.h中定義的更好,這正是您定義跨平臺API時所需要的。所以我最好的選擇是,通過在你的swig接口中包含stdint.h並使用uint64_t作爲變量類型,所有的東西都應該可以直接使用。在MSW的情況下,在google代碼上也有msinttypes.h。 – Bort

回答

4

嘗試之一:

unsigned long 
unsigned int 
long long 
+0

對不起,延遲迴復。我測試了一段時間後,但我一定犯了一個錯誤。最後,long long在Java中產生了一個long [],這正是我所期待的。我結束了這個: %應用很長* OUTPUT {long * call_id}; – user1816142