带有指针的 swift 和 C++ 函数

swift and c++ function with pointers

本文关键字:C++ 函数 swift 指针      更新时间:2023-10-16

我必须在项目中使用大C++文件。在这个文件中有类 使用公共函数检测

void processFrame_new(const unsigned char *frame_i, int width_i, int height_i,
                      uint timestamp, int &state, int &index, int &x, int &y,
                      int &debug);

据我了解,我可以通过指针状态、索引、x、y、调试从这个函数中获得结果。此函数中的计算需要时间,因此获取结果是异步问题。如何调用此函数并获得结果?

PS 感谢 rob mayoff 现在我明白了如何包装C++代码。最后一个问题"如果在 processFrame_new(...需要一些时间吗?

你不能直接从 Swift 调用 C++ 接口,因为导入器只能理解 C 和 Objective-C,而不能理解C++。所以你需要编写一个严格使用C或Objective-C接口的包装器。

例如,可以在头文件中声明一个 C 包装函数,如下所示:

// wrapper.h
#ifndef wrapper_h
#define wrapper_h
#ifdef __cplusplus
extern "C" {
#endif
typedef struct {
    int state;
    int index;
    int x;
    int y;
    int debug;
} WrapperReturnValue;
WrapperReturnValue wrapped_processFrame_new(const unsigned char *frame, int width, int height, unsigned int timestamp);
#ifdef __cplusplus
}
#endif
#endif /* wrapper_hpp */

在桥接标头中,您可以导入wrapper.h以使 Swift 可以使用WrapperReturnValuewrapped_processFrame_new

// test-Bridging-Header.h
//
//  Use this file to import your target's public headers that you would like to expose to Swift.
//
#import "wrapper.h"

然后,您可以在C++中实现包装器函数,如下所示:

// wrapper.cpp
#include "wrapper.h"
void processFrame_new(const unsigned char *frame_i, int width_i, int height_i,
                      unsigned int timestamp, int &state, int &index, int &x, int &y,
                      int &debug);
WrapperReturnValue wrapped_processFrame_new(const unsigned char *frame, int width, int height, unsigned int timestamp) {
    WrapperReturnValue r = {};
    processFrame_new(frame, width, height, timestamp, r.state, r.index, r.x, r.y, r.debug);
    return r;
}