TonyChyi

我在那一角落患过抽风

让 C 语言使用 Go 的回调函数
2016年02月06日 文章
在封装 XMMS2 的过程中我遇到了一个问题 typedef int (*xmmsv_list_compare_func_t)(xmmsv_t **, xmmsv_t **); int xmmsv_list_sort (xmmsv_t *listv, xmmsv_list_compare_func_t comparator) XMMS_PUBLIC; 这货居然用了回调(Callback)! 于是我尝试直接将 Go 函数的地址传给 C 代码,结果只有一个,段错误。因为 Cgo 只对打过 //export 注释的函数建立调用的 Stub 终于我还是在 Stack Overflow 的这个问题中受到了启发。 不要尝试直接调用 Go 函数,而是通过一个已经导出的函数间接的去调用它。 于是我写了一个名叫 callback 的包。 package callback /* void doTest(int); typedef void (*callback)(int); // 模拟一个需要 callback 的函数 static void real_func(callback func){ func(9); // BAKA } static void real_func_wrapper(){ real_func(doTest); } */ import "C" import "sync" type CallbackFunc func(int) // 关键就在这里,需要设置一个全局变量 var w CallbackFunc func init() { w = func(i int){} } //export doTest func doTest(i C.
Tags: #Go · #C
基于libxmmsclient的Go语言绑定
2016年01月14日 文章
代码:[email protected] 文档:[email protected] 在我发现 XMMS2 是使用了 C/S 架构以后,就有了一个想法: 用 Go/QML/XMMS2 写一个简单的音乐播放器,顺带可以收听网易云音乐 XMMS2 有很多种前端,从桌面到 Web 页面什么都有,然而大部分项目长期不更新了。 XMMS2 官方支持的语言有:C/C++/Python/Perl/Ruby。嗯,没有 Go 从上个周末开始,我尝试用抓包的方法来分析 XMMS2 的通讯协议,一无所获。 代码就很复杂了,还是二进制的协议,这怎么搞嘛! 不要重复造轮子!不要重复造轮子!不要重复造轮子! 重要的事情说三遍 显然更讨巧的办法是做一个绑定。 一开始我就有了下面这一套代码 package xmms2go /* #cgo CFLAGS: -I/usr/include/xmms2 #cgo LDFLAGS: -lxmmsclient #include <xmmsclient/xmmsclient.h> */ import "C" import ( "errors" "fmt" ) type Xmms2Client struct { Connection *X.xmmsc_connection_t result *C.xmmsc_result.t returnValue *C.xmmsv_t errorBuff *C.char } func NewXmms2Client(clientName string) (*Xmms2Client, error) { x := new(Xmms2Client) x.
Tags: #Go · #Xmms2 · #C

 

TonyChyi © 2018 GPLv2