SWIGTPYE_p数据类型Java 在将C++中的本机库封装到java的过程中,我遇到了SigigType pl类。阅读SWIG文档,然后根据我的答案,我或多或少地理解SWIG在不知道如何处理C++数据类型时生成这些类。它试图创建一个指向数据类型的指针,但这些SWIGTYPE类在功能上似乎没有用处

SWIGTPYE_p数据类型Java 在将C++中的本机库封装到java的过程中,我遇到了SigigType pl类。阅读SWIG文档,然后根据我的答案,我或多或少地理解SWIG在不知道如何处理C++数据类型时生成这些类。它试图创建一个指向数据类型的指针,但这些SWIGTYPE类在功能上似乎没有用处,java,c++,types,type-conversion,swig,Java,C++,Types,Type Conversion,Swig,我已将%include typemaps.I放在.I文件中,并使用typemaps作为指针,如: %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

我已将
%include typemaps.I
放在.I文件中,并使用typemaps作为指针,如:

%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等方法进行PKT,但是set_f接受SWIGTYPE_p_float作为输入,SWIGTYPE_p_float除了swigCptr和swigcmoown之外没有其他内容

我想我还没有正确地打印float[],但我真的不明白应该怎么做,为什么


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

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

如果要使用阵列,可以通过执行以下操作来使用:

%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;
这会生成您希望的代码。(与其他一些包装数组的方法相比,这是有效的,因为数组的大小在编译时是固定的)