从Luaj运行Java方法,“期望索引,得到字符串”。
2014-11-15 3:38:39
收藏:0
阅读:86
评论:1
我正在开发一个小项目,希望包括Lua脚本,以便用户可以创建自己的内容。我大部分功能已经实现了,可以加载脚本,运行它们,或在Java内部运行特定的Lua方法等等。但我无法弄清楚如何创建一个可以由Lua脚本运行的Java方法。
我搜索过,找到了这篇文章,描述了我想要的内容。
不幸的是,我无法让它起作用。
以下是我正在尝试的代码的最简单示例。
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。这是在"MyLib.java" 中的 env.set("mine", mine);这行代码引起的错误。
Full Error Message
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)
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在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中获取用户配置主目录的跨平台方法
我对代码进行了调整,并重新阅读了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函数库”。