go调用c函数 参数包含回调函数指针

调用第三方c库函数,接口有个回调函数指针

参考这个网址

https://github.com/golang/go/wiki/cgo#function-pointer-callbacks

例如:

// .h
typedef void(*TestCall)(char ** p);
void TestCallBack(TestCall func);

// .cpp
void TestCallBack(TestCall func)
{
	char actemp1[20] = "test TestCallBack";
	char* p = actemp1;
	char* actemp[1] = { p };
	func(actemp);
}

将这段代码编译成动态库

在go调用 TestCallBack

需要做一个桥接

桥接go代码

package main

/*
#include <stdio.h>
void test_go_callback(char ** p);

// The gateway function
void TestCallGDll_brige(char ** p)
{
	test_go_callback(p);
}
*/
import "C"

真正的go调用c代码

package main
/*
#cgo CFLAGS: -Icpp
#cgo LDFLAGS: -Llib -ltestdll
#include "testdll.h"
void TestCallGDll_brige(char ** p);
*/
import "C"
import (
	"fmt"
	"unsafe"
)

//export test_go_callback
func test_go_callback(p **C.char){
	var tmp *C.char = *p
	str := C.GoString(tmp)
	fmt.Println("test_go_callback:", str)
}

func test_dll_callback() {

	C.TestCallBack((C.TestCall)(unsafe.Pointer(C.TestCallGDll_brige)))

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>