如何在SWIG中将C/C++的(const uint8_t*, unsigned int)参数转为C# byte[]
需求说明
需要为以下C++代码在C#侧生成使用byte[]作为参数的友好方法签名:
class BytesWriterStrategy { public: virtual void WriteBytes(const uint8_t* array, unsigned int size) = 0; }; class Base64Strategy final : public BytesWriterStrategy { public: void WriteBytes(const uint8_t* array, unsigned int size) final; };
已经实现了Java侧的SWIG typemap,可以将接口转换为Java侧使用byte[]而非SWIG指针的形式,现在需要对应C#侧的typemap实现。
解决方案
直接在你的SWIG接口文件中加入以下typemap配置即可:
// 配置对外暴露的C#方法参数类型 %typemap(cstype) (const uint8_t *array, unsigned int size) "byte[]" // 配置P/Invoke中间层的参数类型 %typemap(imtype) (const uint8_t *array, unsigned int size) "byte[]" // C#层调用时直接透传输入数组 %typemap(csin) (const uint8_t *array, unsigned int size) "$csinput" // 合并两个C++参数为1个输入,自动提取数组指针和长度 %typemap(in, numinputs=1) (const uint8_t *array, unsigned int size) { $1 = (uint8_t*)$input; $2 = (unsigned int)SZLENGTH($input); } // 若需要支持C#侧继承BytesWriterStrategy重写WriteBytes方法(Director特性),添加以下配置 %typemap(csdirectorin) (const uint8_t *array, unsigned int size) "$iminput" %typemap(directorin) (const uint8_t *array, unsigned int size) { $input = SWIG_CSharpNewByteArray((const char*)$1, $2); }
配置完成后生成的C#代码会得到和Java侧一致的效果,WriteBytes方法仅需要传入一个byte[]类型参数,SWIG会自动完成数组指针、长度和C++接口的映射。
内容的提问来源于stack exchange,提问作者Štefan Bellus
相关产品推荐
相关产品推荐

