java - SWIGTPYE_p 数据类型 Java

标签 java c++ types type-conversion swig

在将 C++ 中的 native 库包装到 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[],但我真的不明白它应该如何完成以及为什么?

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

最佳答案

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;

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

关于java - SWIGTPYE_p 数据类型 Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10406778/

相关文章:

java - 使用 run() 代替 main

java - 将 "current user"保留在 threadlocal 中

Java:如何通过存储在变量中的名称访问类的字段?

c++ - 需要帮助优化动态规划问题的解决方案

python - 列表元素的类型测试

java - PreparedStatement 和 DateTime

c++ - Winsock c++,程序在连接到离线服务器时卡住

采用 DenseBase 的模板函数中的 c++ 特征 block 操作

c - 无法处理号码 600851475143,但我可以完美处理 13195

scala - 高级类型成员声明之间的区别