如何处理 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,而不仅仅是一个不透明的指针。