如何在Java中使用SWIG生成的C结构通过SWIG/JNI作为C函数的输入
我有一个SWIG接口文件,它向我的Java应用程序公开了一些C函数(通过JNI),这些C结构被用作C函数的输入(通过SWIG/JNI)。SWIG将结构生成为Java类,但我不确定如何设置structures属性,因为setter采用SWIG生成的类型。我需要先设置structures属性,然后再将其作为输入从Java类传递到C函数中。示例_location_id_t_是我需要通过的类,但是如何在Java中使用SWIG生成的C结构通过SWIG/JNI作为C函数的输入,java,java-native-interface,swig,Java,Java Native Interface,Swig,我有一个SWIG接口文件,它向我的Java应用程序公开了一些C函数(通过JNI),这些C结构被用作C函数的输入(通过SWIG/JNI)。SWIG将结构生成为Java类,但我不确定如何设置structures属性,因为setter采用SWIG生成的类型。我需要先设置structures属性,然后再将其作为输入从Java类传递到C函数中。示例_location_id_t_是我需要通过的类,但是id和Phy_idx的设置器采用以下SWIG类型。如何填充SWIGTYPE_p_unsigned_char和
id
和Phy_idx
的设置器采用以下SWIG类型。如何填充SWIGTYPE_p_unsigned_char
和SWIGTYPE_p_uint32_t
,以便设置SWIGTYPE_uint32_t
类的Id
和Phy_idx
属性
setId(SWIGTYPE\u p\u unsigned\u char value)
和setPhy\u idx(SWIGTYPE\u p\u uint32\u t value)
在不提供任何额外信息的情况下,SWIG默认假定您希望将内容包装为可以从一个函数返回并传递到另一个函数的类型,即使不能在目标语言中进行有意义的包装 每次你看到一个类型开始时,
SWIGTYPE\uu…
,这意味着SWIG不知道如何生成更好的包装器,这是它能想到的最好的方法
SWIG确实提供了默认类型映射,可在以下方面为您提供帮助:
- 对于
setPhy\u idx(uint32\u t值)代码>您需要在界面中添加的全部内容是:
目标语言中将使用一种可以表示%include "stdint.i" void setPhy_idx(uint32_t value);
的类型uint32\t
- 对于
这完全取决于setId(无符号字符*值)
实际上是什么-如果它是值
终止字符串,您可以执行以下操作:NULL
%apply char * { unsigned char * }; void setId(unsigned char *value);
并且目标语言中将使用%apply unsigned long { unsigned char * }; void setId(unsigned char *value);
字符串 如果要将指针作为整数类型传递,可以使用以下命令:
%apply char * { unsigned char * }; void setId(unsigned char *value);
相反 如果%apply unsigned long { unsigned char * }; void setId(unsigned char *value);
是指向单个unsigned char*value
的指针,则可以执行以下操作:unsigned char
指示SWIG将poitner视为单个指针。(如果它也是一个指针,则可以应用于%include "typemaps.i" %apply unsigned char *INPUT { unsigned char *value }; void setId(unsigned char *value);
)uint32\u t
%include“arrays\u Java.I”
将涵盖无符号字符[32]
->short[]
。(它必须是短的
,因为它是无符号的,不适合字节
)。如果它不起作用,让我知道,我再看一看。上面两个例子很好,但是对于一个以(void*input)作为输入的函数呢?如果我想将字符串从Java传递给函数,需要添加什么类型的SWIG接口?还是最好创建一个采用特定类型的新C函数?如果你想传递字符串(即char*
)对于您的void*
,您可以使用%apply
将char*
的规则应用于特定参数,例如%apply char*{void*input}