Запуск Java-метода из Luaj, "ожидается индекс, есть строка"

Я работаю над небольшим проектом и надеялся включить сценарии lua, чтобы пользователи могли создавать свой собственный контент. Я получил это в основном работать. Я могу загружать сценарии, запускать их или запускать определенные методы Lua из Java и т. Д. Но я не могу понять, как создать метод в Java, который может быть запущен сценарием Lua.

Я искал вокруг и нашел этот пост, который описывает именно то, что я хочу.

К сожалению, я не могу заставить его работать.

Вот самые простые примеры кода, которые я пробую.

Main.java

public static void main(String[] args) {    
    LuaValue _G = JsePlatform.standardGlobals();
    _G.load(new MyLib());
    _G.get("dofile").call( LuaValue.valueOf("Files/Fighters/Sticky/prop/test.lua"));
    LuaValue MyAdd = _G.get("MyAdd");
    LuaValue retvals = MyAdd.call(LuaValue.valueOf(4), LuaValue.valueOf(-110));
}

MyLib.Java

public class MyLib extends OneArgFunction {
    public static MyLib MYLIB = null;
    public MyLib() {
        MYLIB = this;
    }

public LuaValue call(LuaValue env) {
        LuaTable mine = new LuaTable(0,30); // I think "new LuaTable()" instead of "(0, 30)" is OK
        mine.set("someFunc", new SomeFunc());
        env.set("mine", mine);
        env.get("package").get("loaded").set("mine", mine);
        return mine;
    }
}

SomeFunc.java

abstract class UnaryOp extends OneArgFunction {
    public LuaValue call(LuaValue arg) {
        return valueOf(call(arg.checkdouble()));
    }
    abstract protected double call(double d);
}

final class SomeFunc extends UnaryOp {
    protected double call(double d) {
        return Math.abs(d);
    }
}

test.lua

require "mine"
function MyAdd( num1, num2 )
   return mine.someFunc(num2-2)
end
function MySubtract( num1, num2 )
    return num1 - num2
end
function MyMult( num1, num2 )
    return num1 * num2
end

Я получаю ошибку index expected, got string, Это вызвано на линии env.set("mine", mine); внутри "MyLib.java"

Полное сообщение об ошибке

Exception in thread "main" org.luaj.vm2.LuaError: index expected, got string
at org.luaj.vm2.LuaValue.typerror(Unknown Source)
at org.luaj.vm2.LuaValue.settable(Unknown Source)
at org.luaj.vm2.LuaValue.set(Unknown Source)
at org.luaj.vm2.LuaValue.set(Unknown Source)
at luajClasses.MyLib.call(MyLib.java:17)
at org.luaj.vm2.lib.OneArgFunction.call(Unknown Source)
at org.luaj.vm2.LuaValue.load(Unknown Source)
at luajClasses.Main.main(Main.java:17)

1 ответ

Решение

Я возился с кодом, перечитал страницу "Начало работы с Luaj" и разобрался с ней.

При создании библиотеки, как я сделал в файле "MyLib.Java", вам нужна переменная lua для установки библиотеки. Эта переменная должна иметь тип "LuaTable".

Когда вы расширяете "OneArgFunction", как я, вы получаете только одно LuaValue, оно на самом деле имеет тип "LuaString", а не "LuaTable".

Исправление состояло в том, чтобы сделать класс MyLib расширением twoArgFunction, поскольку второе значение - это настоящая "env"LuaTable.

Полученный код, в случае, если это поможет любому:

public class MyLib extends TwoArgFunction {
    public static MyLib MYLIB = null;
    public MyLib() {
        MYLIB = this;
    }

public LuaValue call(LuaValue modname, LuaValue env) {
        LuaTable mine = new LuaTable(0,30);
        mine.set("someFunc", new SomeFunc());
        env.set("mine", mine);
        env.get("package").get("loaded").set("mine", mine);
        return mine;
    }
}

Для получения дополнительной информации я предлагаю перейти на страницу "Начало работы с Luaj" и прокрутить вниз до "Библиотеки функций Java".

Другие вопросы по тегам