我有一個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。
長型有什麼缺陷嗎?這看起來很奇怪嗎?
我想這取決於你的架構。 'long'也可以是32位的'int'。你有沒有嘗試'長'?或者更好'uint64_t'和'uint32_t'?您可以檢查stdint.h的結構,8字節整數應該是多少。 – Bort
這是目前爲Android的,但C API必須跨平臺,所以我不知道如果我在這裏用正確的方向使用很長時間? – user1816142
我不知道Android是否完全支持C99標準,如果它確實比uint64_t在stdint.h中定義的更好,這正是您定義跨平臺API時所需要的。所以我最好的選擇是,通過在你的swig接口中包含stdint.h並使用uint64_t作爲變量類型,所有的東西都應該可以直接使用。在MSW的情況下,在google代碼上也有msinttypes.h。 – Bort