如何在SWIG生成的Java包装中处理ptrdiff_t?

如何在SWIG生成的Java包装中处理ptrdiff_t?,java,swig,ptrdiff-t,Java,Swig,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),

我有一个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,在这个SWIGTYPE中我无法访问实际的long值


如何在SWIG中控制此操作?

有几个选项。。。但是,SWIG不知道ptrdiff_t,并且定义它也不是最好的主意。 我将执行以下操作:将%include添加到接口文件中,然后添加到接口文件中:

%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有适当的解释,而不仅仅是一个不透明的指针。

我的ptrdiff_t在Java中映射为int,但我希望有长的64位。您知道如何实现这一点吗?ptrdiff_t intptr_t在x86上映射到Java int,在x64上映射到Java long。您不应该将ptrdiff_t硬编码为Java long,因为如果在x86机器上编译此类代码,则可能会发生编译错误,或者只是在指针初始化时对long进行静默截断。隐式错误更糟糕。问题是我在x64计算机上运行,SWIG为intptr_t生成Java int。有趣的是,C类型int、long和long-long都正确地映射到了Java int、int和long。@tongfei chen,您可能在swig环境或编译器设置中遇到了一些问题。如果指定相应的编译器选项,您可以[故意]在x64平台上构建x86二进制文件。此外,您应该检查是否使用x64或x86 swig构建。最后,将intptr\t映射到Java int的问题与构建环境和/或编译器设置有关,而不是与swig或上面列出的头文件有关。