如何在Java中使用SWIG生成的C结构通过SWIG/JNI作为C函数的输入

如何在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和

我有一个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
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
    的指针,则可以执行以下操作:

    %include "typemaps.i"
    %apply unsigned char *INPUT { unsigned char *value };
    
    void setId(unsigned char *value);
    
    指示SWIG将poitner视为单个指针。(如果它也是一个指针,则可以应用于
    uint32\u t


您好,awoodland,您提供的示例非常适合phy_idx,但我后来发现该Id是C端的32字节字符数组。它在头文件中定义为typedef unsigned char example_id_v1_t[32];是否有一个include或apply可以创建一个可用的Java结构?@c12-我认为
%include“arrays\u Java.I”
将涵盖
无符号字符[32]
->
short[]
。(它必须是
短的
,因为它是无符号的,不适合
字节
)。如果它不起作用,让我知道,我再看一看。上面两个例子很好,但是对于一个以(void*input)作为输入的函数呢?如果我想将字符串从Java传递给函数,需要添加什么类型的SWIG接口?还是最好创建一个采用特定类型的新C函数?如果你想传递字符串(即
char*
)对于您的
void*
,您可以使用
%apply
char*
的规则应用于特定参数,例如
%apply char*{void*input}