在 swift 中访问 C 变量

Access C variable in swift

我正在尝试访问 .h 文件中声明的状态变量,但编译器说该变量不存在。我是否需要在桥接头文件中添加任何内容?

在我的 swift 文件中,我无法访问 dstate cstate

编译器在 g722_coder_init(&dstate) 行说 "Use of unresolved identifier 'dstate'"。

头文件

#ifdef __cplusplus
extern "C" {
#endif

extern struct g722_dstate dstate;
extern struct g722_cstate cstate;

int g722_coder_init (  struct g722_cstate *s  );
int g722_encode(short *data, unsigned char *outdata,int len, struct g722_cstate *s  );
int g722_decoder_init (  struct g722_dstate *s);
int  g722_decode(unsigned char *decdata, short *pcmout, int len,  struct g722_dstate *s );

#ifdef __cplusplus
}
#endif

桥接头

#import "g722_codec.h"

您可以在 c 文件中创建一个函数,并在桥接中添加函数名称作为前向声明 header 例如 -

//In c File you have definition & forward declaration
int g722_encode(short *data, unsigned char *outdata,int len, struct g722_cstate *s  );
int g722_encode(short *data, unsigned char *outdata,int len, struct g722_cstate *s  ){

}

桥接 header 应该是 -

 #import "g722_codec.h"
int g722_encode(short *data, unsigned char *outdata,int len, struct g722_cstate *s  );

问题是 struct g722_dstate 是一个 "incomplete type", 并且 Swift 不能导入不完整类型的变量,只能导入变量 指向不完整类型的指针(并且这些是导入的 如 OpaquePointer).

将完整的结构定义添加到导入的头文件中 是最简单的解决方案。

如果这不可能,那么一种解决方法是添加

#import "g722_codec.h"

static struct g722_dstate * __nonnull dstatePtr = &dstate;

到桥接头文件,它定义了一个包含 "opaque" dstate 变量的地址。这被导入到 Swift 作为

var dstatePtr: OpaquePointer

然后可以使用,例如作为

g722_coder_init(dstatePtr)