【发布时间】:2019-10-07 00:42:04
【问题描述】:
我维护了一个 C++ SDK,现在需要将其转换为其他语言(特别是 C# 和 Java)。我正在使用 SWIG 生成我的包装器代码并成功完成了 Java 工作。我现在需要让 C# 工作。
我有一个 C++ 函数(忽略函数签名中的 Header 对象 - 我已经解决了)
int send(Header header, char *payload);
此外,我在 C++ 中有一个 director 类,如下所示:
class Callbacks {
public:
virtual ~Callbacks() { }
virtual void receive(Header header, char *payload) { }
};
这允许我在我的 Java 和 C# 代码中创建回调。
我需要 C# 中 send 和 receive 的以下函数签名:
int send(Header header, byte[] payload);
和
void receive(Header header, byte[] payload);
SWIG 中的类型映射似乎是要走的路,所以这是我为 C# 进行类型映射的尝试:
%module(directors="1") example
%{
#include "example.h"
%}
%feature("director") Callbacks;
%include "arrays_csharp.i"
CSHARP_ARRAYS(char, byte)
%typemap(imtype, inattributes="[In, MarshalAs(UnmanagedType.LPArray, SizeConst=2048, ArraySubType=UnmanagedType.U1)]") char INPUT[] "byte[]"
%apply char INPUT[] {char *payload}
%include "example/include/example.h"
该接口文件的结果获得了我想要的函数签名,但我的字节数组的大小仅为 1,并且我只获得了原始字符缓冲区中的第一项。似乎 SWIG 将 char* 解释为指向 char 的指针,因此将我的 char* 缓冲区中的第一个元素插入到字节数组中并称之为好。但我想创建一个大小为 2048 的字节数组(没有有效负载的大小会大于该大小)并从 char* 缓冲区填充该字节数组。如果有什么不同的话,我的 Header 类对象的大小与 char* 缓冲区一样大,但我现在真的不太关心这个,而是坚持使用 2048 字节的总大小。
我们将不胜感激您的想法或帮助!
@Flexo 我在 StackOverflow 上看到了你的其他 SWIG 帖子,你似乎是我的人帮助我。祈祷你看到这个!
【问题讨论】:
标签: c# arrays char buffer swig