将Java库函数加载到Luaj中。
2013-4-19 10:42:59
收藏:0
阅读:178
评论:3
我无法加载 Java 函数,以便可以通过 luaj 从 lua 文件调用它。
我目前所做的是创建像这样的东西:
在 some_package/aif.java 中:
```
package some_package;
public class aif extends TwoArgFunction {
public aif() {
}
@Override
public LuaValue call(LuaValue modname, LuaValue env) {
LuaValue library = tableOf();
library.set("foo", new foo());
env.set("aif", library);
return library;
}
//the rest contains the implementations of java functions
}
```
然后在 lua 文件中:
```
require "some_package/aif"
--etc ...
```
然后在 Main.java 文件中:
```
public static void Main(String[] args) {
String script = "lib/some_lua_file.lua";
globals = JsePlatform.standardGlobals();
LuaValue chunk = globals.loadFile(script);
chunk.call( LuaValue.valueOf(script) );
}
```
这个代码可行,但是我想在 lua 文件中不使用 "require"。我已经在 C++ 中以类似的方式实现了这一点,使用这一行:
```
luaL_requiref(L, "aif", luaopen_aiflib, 1);
```
我们可以在 luaj 中这样做吗?我尝试过:
```
globals.load(new aif());
```
但是得到了异常“org.luaj.vm2.LuaError:预期索引,得到 nil(aif 类的调用函数中的变量 env 为 nil)”。
有人知道如何将 aif 设置为 lua 库以与 luaj 一起使用吗?
点赞
用户854058
我在查看 Lua 库的 luaj 实现后找到了答案。
我修改了我的代码:
package some_package;
public class aif extends OneArgFunction{
public aif() {
}
@Override
public LuaValue call(LuaValue env) {
Globals globals = env.checkglobals();
LuaTable aif = new LuaTable();
aif.set("foo", new foo());
env.set("aif", aif);
globals.package_.loaded.set("aif", aif);
return aif;
}
//其余代码包括 Java 函数的实现
}
我将 aif 类中的 TwoArgFunction 改成了 OneArgFunction,因为教程中建议这样做。现在使用上面的代码,就不需要在 lua 文件中 require 这个类了。
2013-04-26 12:10:39
用户2927268
你可以像下面这样写你的 MyXArgImpl:
package mypackage;
import org.luaj.vm2.LuaValue;
import org.luaj.vm2.lib.ZeroArgFunction;
public class MyZeroArgImpl extends ZeroArgFunction {
public LuaValue call() {
return valueOf("My Zero Arg Implementation");
}
}
然后将它添加到你的 LUA 中:
LuaValue globals = JsePlatform.standardGlobals();
globals.get("dofile").call(LuaValue.valueOf(yourScriptfile));
globals.set("callMyFunction", new MyZeroArgImpl());
现在你可以在你的 LUA 脚本中调用你的函数,即使不使用 require('...'):
print(callMyFunction())
2013-10-28 08:18:01
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的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中获取用户配置主目录的跨平台方法
假设你加载的脚本里有一个名为"receive_aif"的函数
function receive_aif (aifObj) --这是你如何调用与aifObj相关联的公共函数的方法 aifObj:someAifFunction () end从Java中,你可以传递aif实例如下:(这应该与任何Java对象一起使用)
aif aifObj = new aif() LuaValue receive_aif_handle = globals.get("receive_aif"); LuaValue retvals = receive_aif_handle.call( CoerceJavaToLua.coerce( aifObj ) );我在我的应用程序中使用类似的结构,使用的是“3.0alpha-2”发布版本