Luajit ffi 实现一个块终结器。
2015-3-4 23:33:0
收藏:0
阅读:86
评论:2
我正在使用luajit ffi将libcurl包装起来。我的终结器没有被调用。
local ffi = require("ffi")
ffi.cdef [[
typedef struct{} CURL;
CURL * curl_easy_init();
void curl_easy_cleanup(CURL *);
]]
local CURL_lib = ffi.load("../lib/libcurl.so")
local CURL_CTX
local CURL_CTX_mt = {
__gc = function() print "finalizing"; CURL_lib.curl_easy_cleanup(CURL_CTX); end
}
ffi.metatype("CURL", CURL_CTX_mt)
CURL_CTX = ffi.new("CURL[1]")
CURL_CTX = CURL_lib.curl_easy_init();
print "done"
我错过了什么? :D
顺便说一下,CURL被定义为typedef void CURL;
我确定我尝试的方式还不够完美。有什么建议吗?
有了启示!:自我答案-- 如有任何明显的问题,请仍然欢迎评论。
原文链接 https://stackoverflow.com/questions/9395985
点赞
stackoverflow用户70405
或者您可以像这样在返回的指针上注册终结器:
local ffi = require("ffi")
ffi.cdef [[
typedef struct{} CURL;
CURL * curl_easy_init();
void curl_easy_cleanup(CURL *);
]]
local CURL_lib = ffi.load("../lib/libcurl.so")
local function curl_pointer_finalizer(pointer)
print "finalizing"
CURL_lib.curl_easy_cleanup(pointer)
end
local function curl_easy_init()
return ffi.gc(CURL_lib.curl_easy_init(), curl_pointer_finalizer)
end
local CURL_CTX = curl_easy_init() -- 包装器函数
print "done"
2014-01-28 23:21:20
评论区的留言会收到邮件通知哦~
推荐文章
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
在 luajit 中,编译时类型必须是
structs
(或者unions
,我想),如果你将上下文类型初始化为指针,则不再是struct
。因此,在这里存在概念不匹配的问题。所以,为了修复问题,在你的struct
中添加一个void *
,将metatype
挂载到struct
上,并使用void *
作为库上下文。local ffi = require("ffi") ffi.cdef [[ typedef struct { void * ctx; } curl; curl * curl_easy_init(); void curl_easy_cleanup(curl *); ]] local curl_lib = ffi.load("../lib/libcurl.so") local curl local curl_mt = { __gc = function() curl_lib.curl_easy_cleanup(curl.ctx); end } local curl_proto = ffi.metatype("curl", curl_mt) curl = curl_proto(nil) curl.ctx = curl_lib.curl_easy_init();