如何处理 SWIG 生成的 Java 包装器中的 ptrdiff_t?
How to handle ptrdiff_t in SWIG generated Java wrapper?
我在 C:
中有这个结构
typedef struct THTensor {
...
ptrdiff_t storageOffset;
...
} THTensor;
但是,SWIG 生成的 Java 代码是:
public SWIGTYPE_p_ptrdiff_t getStorageOffset() {
return new SWIGTYPE_p_ptrdiff_t(THJNI.THFloatTensor_storageOffset_get(this.swigCPtr, this), true);
}
我希望在 Java 中将 ptrdiff_t
转换为 long
,而不是在 SWIGTYPE_p_ptrdiff_t
中我无法访问实际的 long
值。
我如何在 SWIG 中控制它?
有几种选择...但是 ptrdiff_t
对 SWIG 来说是未知的,并且将其定义为 long
并不是最好的主意。
我会执行以下操作:将 %include <stdint.i>
添加到接口文件,然后在接口文件中添加:
%define ptrdiff_t
intptr_t
%enddef
或者在源码中添加:
#ifdef SWIG
%define ptrdiff_t
intptr_t
%enddef
#endif // SWIG
...
typedef struct THTensor {
...
ptrdiff_t storageOffset;
...
} THTensor;
这样,包装在接口中的代码应该有适当的解释ptrdiff_t
,而不仅仅是一个不透明的指针。
我在 C:
中有这个结构typedef struct THTensor {
...
ptrdiff_t storageOffset;
...
} THTensor;
但是,SWIG 生成的 Java 代码是:
public SWIGTYPE_p_ptrdiff_t getStorageOffset() {
return new SWIGTYPE_p_ptrdiff_t(THJNI.THFloatTensor_storageOffset_get(this.swigCPtr, this), true);
}
我希望在 Java 中将 ptrdiff_t
转换为 long
,而不是在 SWIGTYPE_p_ptrdiff_t
中我无法访问实际的 long
值。
我如何在 SWIG 中控制它?
有几种选择...但是 ptrdiff_t
对 SWIG 来说是未知的,并且将其定义为 long
并不是最好的主意。
我会执行以下操作:将 %include <stdint.i>
添加到接口文件,然后在接口文件中添加:
%define ptrdiff_t
intptr_t
%enddef
或者在源码中添加:
#ifdef SWIG
%define ptrdiff_t
intptr_t
%enddef
#endif // SWIG
...
typedef struct THTensor {
...
ptrdiff_t storageOffset;
...
} THTensor;
这样,包装在接口中的代码应该有适当的解释ptrdiff_t
,而不仅仅是一个不透明的指针。