golang 调用 c的回调函数
  • H5W3
  • 2021-07-07 11:08:03
  1. golang 调用一个c的so库, 函数RegisterCan

  2. c的回调函数结构如下

typedef void (*CanCallBack)(int canChannel, char * canFrame, int canDataLen,unsigned long long canTime);

int RegisterCan(CanCallBack event);

  1. 要用go的实现CanCallBack回调函数的方法

网上找到相关cgo的说明,不是很懂,还望好心人给与提示

回答:

感谢各位的支持,已经找到解决办法

3个文件, can.go , load_so.c , load_so.h

can.go

/*

#include "load_so.h"

#cgo LDFLAGS: -ldl

*/

import "C"

//export CanProcess

func CanProcess(channel int, canFrame string, canDataLen int, timeOfCan uint64) {

//TODO 具体回调业务

}

// 供外部调用

func Receive(){

C.callback()

}

load_so.c

#include "load_so.h"

#include <dlfcn.h>

void CanProcess(int canChannel,char * canFrame, int canDataLen,unsigned long long canTime);

int DoRegisterCan(CanCallBack event)

{

void* handle;

typedef int (*FPTR)(CanCallBack);

handle = dlopen("./lib/filename.so", 1);

if(!handle) {

return -1;

}

FPTR fptr = (FPTR)dlsym(handle, "RegisterCan");

int result = (*fptr)(event);

return result;

}

int callback()

{

return DoRegisterCan(CanProcess);

}

load_so.h

typedef void (*CanCallBack)(int canChannel, char * canFrame, int canDataLen,unsigned long long canTime);

int DoRegisterCan(CanCallBack event);

int callback();

回答:

回答:

说白了,题主需求的场景就是:

  • go语言侧代码调用第三方的C语言库函数,但是库函数要求传入一个函数指针作为回调,然后题主想用cgo实现这个回调

golang官方关于cgo的wiki页有详细的关于题主询问场景下的解决方法介绍。

主要是要做几件事情:

func CanCallBack(canChannel  int, canFrame C.String, canDataLen int, 

canTime uint64) {

//...函数具体实现

}

总得来说就是以上三件事,但是具体写代码时还有一些细节需要注意的,我之前写过一篇博客有提到这些注意点,感兴趣的话,题主可以参考一下:

我写的这篇博客讨论的场景和题主期待的场景略有不同,望注意. 不过这里面存在的坑是共通的,比如说必须定义为main包之类的

以上是 golang 调用 c的回调函数 的全部内容, 来源链接: www.h5w3.com/183091.html