【问题标题】:LuaJava - unprotected error in call to Lua APILuaJava - 调用 Lua API 时出现不受保护的错误
【发布时间】:2014-12-30 09:07:31
【问题描述】:

我正在尝试让一个在 LuaJava 中工作的简单函数(添加两个数字)。我对 Lua 的经验很少,并且发现这很困难,因为我无法找到 LuaJava 的深入文档。我目前可以从 lua 打印到 java 控制台,但除此之外什么都没有。

我尝试了一些方法,但每次都得到相同的错误:

PANIC: unprotected error in call to Lua API (attempt to call a nil value)

这是我正在使用的代码:

import org.keplerproject.luajava.LuaState;
import org.keplerproject.luajava.LuaStateFactory;

public class Hello {
    public static void main(String[] args) {
        LuaState l = LuaStateFactory.newLuaState();
        l.openLibs();
        l.LdoFile("main.lua");
        l.call(0, 0);
        l.getGlobal("add");
        l.pushInteger(1);
        l.pushInteger(1);
        l.call(2, 1);
        int result = l.toInteger(1);
        l.pop(1);
        System.out.println("1 + 1 = " + result); 
    }
}

还有 Lua 文件:

function add(a, b) 
    return a + b
end

我的 IDE 是 Eclipse。提前感谢您的帮助。

【问题讨论】:

    标签: java eclipse lua luajava


    【解决方案1】:

    我将假设问题出现在这一行 l.call(0, 0);

    l.LdoFile("main.lua"); 很可能不会在堆栈上返回必须调用的函数。这就是 lua C 函数luaL_loadfile 所做的。 luaL_dofile 是围绕luaL_loadfile 的宏,运行返回的块函数。

    所以在l.LdoFile("main.lua"); 完成后,我相信您的堆栈中没有任何内容,并且您的add 函数可以使用。

    【讨论】:

    • 谢谢。摆脱了那条线,它现在可以工作了。由于某种原因,我也不得不将 l.pushInteger 调用更改为 l.pushNumber。再次感谢您的帮助!
    猜你喜欢
    • 2012-08-14
    • 1970-01-01
    • 2021-09-06
    • 1970-01-01
    • 2017-05-29
    • 1970-01-01
    • 1970-01-01
    • 2020-08-16
    • 1970-01-01
    相关资源
    最近更新 更多