用buffer作为参数从Go调用c++函数



我们有(所有意图和目的)类似于下面的c++代码。

calc.h

#pragma once
extern "C" {
void doCalc(uint8_t** buffer);
}

calc.cpp

#include <cstdint>
#include "calc.h"
void doCalc(uint8_t** buffer) {
uint8_t lb[256];
for (int i = 0; i < 256; i++) {
lb[i] = i;
}
*buffer = new uint8_t[256];
std::memcpy(*buffer, lb, 256);
}

我们需要从Go调用这个方法,但不确定如何在Go端构造缓冲区变量来传递(看到在调用之前长度是未知的- c++函数中的256应该被认为是未知的)。

我做了一个稍微不同的例子,适合您的用例:

package main
/*
#include <stdio.h>
void print_words(int count, char** words) {
for (int i = 0; i < count; i += 1) {
printf(words[i]);
}
}
*/
import "C"
import "unsafe"
func main() {
words := make([]*C.char, 2)
words[0] = C.CString("Hello ")
words[1] = C.CString("Worldn")
C.print_words((C.int)(len(words)), (**C.char)(unsafe.Pointer(&words[0])))
}

基于@Jacob Wischnat的回答(谢谢!),我能够让它为我的例子工作:

func main() {
cBuf := make([]*C.uint8_t, 1)
C.doCalc((**C.uint8_t)(unsafe.Pointer(&cBuf[0])))

gBuf := C.GoBytes(unsafe.Pointer(cBuf[0]), 256)
// ...
}

最新更新