我正在与 LuaJIT 的 FFI 合作,并且得到了非常奇怪的结果。这将返回PANIC:不 protected 错误(错误回调)
:
function idle(ms)
myDLL.myDLL_idle(session, ms)
end
但是这个简单的打印已经解决了问题。
function idle(ms)
print("anything")
myDLL.myDLL_idle(session, ms)
end
另一个极其奇怪的解决方案是在主函数内使用myDLL.myDLL_idle()
。这怎么可能?如果我将调用放入函数中,我也不能执行任何任意函数,唯一保证工作的是打印和 sleep 。
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)
它在做同样的事情,但只是在另一个函数中。如果我尝试将其放入函数方法中,则打印修复它只会增加这的完全奇怪性。这是一个大问题。
最佳答案
根据the documentation ,如果 FFI 代码调用通过存储的回调回调到 Lua 的 C 函数,则 LuaJIT 不允许 FFI 调用进行 JIT 编译。在大多数情况下,LuaJIT 会检测到这些调用并避免编译,但如果没有检测到,它会中止并显示“错误回调”错误消息。额外的 print
有所帮助,因为它阻止了 JIT 编译(print
是 not compiled atm 。)。
建议的解决方案(而不是调用 print
)是使用 jit.off
函数显式停止 FFI 调用进行 JIT 编译。
关于C++ 和 Lua - 不 protected 错误(错误的回调)?这怎么可能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25924755/