我正在使用LuaJIT的FFI,我的结果非常奇怪。这会返回PANIC: Unprotected Error (bad callback)
:
function idle(ms)
myDLL.myDLL_idle(session, ms)
end
但是这个简单的印刷解决了这个问题。
function idle(ms)
print("anything")
myDLL.myDLL_idle(session, ms)
end
另一个非常奇怪的解决方案是在main函数中使用myDLL.myDLL_idle()
。这怎么可能呢?如果我把调用放在一个函数中,那么我就可以做任何任意函数了,唯一可以保证工作的是打印和休眠。
function idle(ms)
myDLL.myDLL_idle(session, ms)
end
myDLL.myDLL_idle(session, ms) -- works
idle(ms) -- doesn't work (unless first line of idle() is a print statement)
它正在做同样的事情,但只是在另一个功能。如果我尝试将它放在一个函数方法中,那么修复它就会增加它的完整怪异性。这是一个很大的问题。
答案 0 :(得分:2)
根据the documentation,如果FFI代码调用通过存储的回调调回Lua的C函数,则LuaJIT不允许FFI调用进行JIT编译。在大多数情况下,LuaJIT会检测这些调用并避免编译,但是如果它没有,则它会以"错误的回调"中止。错误信息。额外的print
有帮助,因为它阻止了JIT编译(print
是not compiled atm。)。
建议的解决方案(而不是调用print
)是使用jit.off
函数显式停止FFI调用。