【问题标题】:Access C variable in swift快速访问 C 变量
【发布时间】:2017-09-07 23:17:30
【问题描述】:

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

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

编译器在g722_coder_init(&dstate) 行上显示“使用未解析的标识符'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"

【问题讨论】:

    标签: swift swift3 header interop bridge


    【解决方案1】:

    问题是struct g722_dstate是一个“不完整类型”, 并且 Swift 不能导入不完整类型的变量,只能导入变量 它们是指向不完整类型的指针(并且这些是导入的 如OpaquePointer)。

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

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

    #import "g722_codec.h"
    
    static struct g722_dstate * __nonnull dstatePtr = &dstate;
    

    到桥接头文件,它定义了一个包含 “不透明”dstate 变量的地址。这是导入到 Swift 的

    var dstatePtr: OpaquePointer
    

    然后可以使用例如作为

    g722_coder_init(dstatePtr)
    

    【讨论】:

      【解决方案2】:

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

      //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  ){
      
      }
      

      桥接头应该是 -

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-11-04
        • 1970-01-01
        • 1970-01-01
        • 2015-01-05
        • 2012-01-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多