【问题标题】:SWIGTPYE_p data types JavaSWIGTPYE_p 数据类型 Java
【发布时间】:2012-05-11 12:22:56
【问题描述】:

在将 C++ 中的本机库包装到 Java 的过程中,我遇到了 SWIGTYPE_p_ 类。阅读 SWIG 文档,并按照here 的回答,我或多或少地理解,当 SWIG 不知道如何处理 C++ 数据类型时,它会生成这些类。它尝试创建指向数据类型的指针,但这些 SWIGTYPE 类在功能上似乎没有用。

我已将 %include typemaps.i 放入 .i 文件中,并将类型映射用于指针,例如:

%apply char * {unsigned char *};
%apply float * {float *};
%apply int * {int *};
%apply int * {unsigned long *};
%apply short * {unsigned short *};
%apply byte * {byte *};
%apply long * {unsigned long long *};

我也尝试过使用 float[] { float[] }。

出错的例子:

typedef union CAN_PKT_ {
   unsigned long long   all;
   float                f[2];
   unsigned long        ul[2];
   unsigned short       us[4];
   unsigned char        uc[8];
} CAN_PKT;

产生具有 set_all、set_f 等方法的 CAN_PKT 类,但 set_f 接受 SWIGTYPE_p_float 作为输入,而 SWITYPE_p_float 除了 swigCptr 和 swigCMemOwn 之外没有其他内容。

我想我没有正确地键入 float[],但我真的不明白应该如何做以及为什么?

编辑:这个联合是唯一使用short 数据类型的地方。我可以通过在 .i 文件中忽略此文件运行 swig 来显示这一点,SWIGTYPE_p_unsigned_short 没有创建。但是,如果我注释掉联合的内容,以使 unsigned short 根本不在任何地方使用,并将此文件包含到 swig 中,它仍然会创建 SWIGTYPE_p_unsigned_short。为什么会发生这种情况?

【问题讨论】:

    标签: java c++ types type-conversion swig


    【解决方案1】:

    SWIG 已将您的数组类型包装为指针,但它无法在高级语言中非常有意义地公开指针的概念,因此它被包装为不透明类型。

    如果您想使用数组,那么您可以通过以下方式使用SWIG's support for arrays with Java

    %module test
    
    %include "arrays_java.i"
    
    typedef union CAN_PKT_ {
       unsigned long long   all;
       float                f[2];
       unsigned long        ul[2];
       unsigned short       us[4];
       unsigned char        uc[8];
    } CAN_PKT;
    

    它会生成您希望的代码。 (与其他一些包装数组的方法相比,这很有效,因为数组的大小在编译时是固定的)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-28
      • 1970-01-01
      • 2010-11-01
      • 1970-01-01
      • 2010-12-31
      • 2014-03-09
      • 1970-01-01
      相关资源
      最近更新 更多