Java调用lua脚本-LuaJ
2017-10-31 本文已影响0人
转角的咖啡店
版权说明:本文由博主原创,转载请注明出处,多谢-转角的咖啡店
LuaJ介绍
Luaj 是一个 Java 的 Lua 解释器,基于 Lua 5.2.x 版本,目的是 :
- 基于 Java 的实现,可以在 Java 应用中集成 Lua 虚拟机
- 轻量级、高性能的执行 Lua
- 多平台支持
- 完整的库和工具支持
- 可在 Java ME、SE 和 EE 环境中执行
- luajava api 支持
- 混合调试
LuaJ导入到工程
目前最新的版本是3.0.1. 新版的LuaJ3.0是针对Lua5.2开发的,对Lua5.1会有不兼容的部分(例如module函数不能用了)。如果使用Lua5.1,则可以使用LuaJ2.0.3。
maven工程,则直接在pom.xml中引入
<dependency>
<groupId>org.luaj</groupId>
<artifactId>luaj-jse</artifactId>
<version>3.0.1</version>
</dependency>
Jar包下载地址:
- 黑鸭:http://10.90.50.148/d/component/search?q=LuaJ
- sourceforge:https://sourceforge.net/projects/luaj/
- github: https://github.com/luaj/luaj
LuaJ用法
Talk is cheap, show me the code。个人非常喜欢这句话,接下来就直接展示代码实现。
Lua脚本示例:
对lua语言不太熟悉的同学,请自行搜索lua的相关教程,有很多案例,这里就不讲了。
hello.lua
local transcoder = {}
-- 无返回对象的调用情况
function helloWithoutTranscoder()
print 'hello, sky -- no transcoder '
end
-- 无参
function transcoder.hello()
print 'hello'
return 'hello, sky'
end
-- 参数为string数据
function transcoder.test(str)
print('data from java is:'..str)
return 'the parameter is '..str
end
-- 返回一个lua对象
function transcoder.getInfo()
return {
['userId'] = '9999',
['services'] =
{{
'eat',
'drink'
}, {
'eat2',
'drink2'
}}
}
end
--[[
infoObj-json示例:
{
'userId': '1111',
'services': [{
'0' : 'eat-test',
'1' : 'drink-test'
}]
}
--]]
-- 传入一个lua对象
function transcoder.readInfo(infoObj)
return infoObj.userId
end
return transcoder
java代码调用
无返回对象情况下java调用lua函数
String luaFileName = getClass().getClassLoader().getResource("hello.lua").toURI().getPath();
Globals globals = JsePlatform.standardGlobals();
globals.loadfile(luaFileName).call();
LuaValue func = globals.get(LuaValue.valueOf("helloWithoutTranscoder"));
String result = func.call().toString();
logger.error("result---"+result);
打印结果为:result---hello, sky -- no transcoder
接下来均为在有返回对象情况下调用lua函数
无参lua函数
String luaFileName = getClass().getClassLoader().getResource("hello.lua").toURI().getPath();
Globals globals = JsePlatform.standardGlobals();
LuaValue transcoderObj = globals.loadfile(luaFileName).call();
LuaValue func = transcoderObj.get(LuaValue.valueOf("hello"));
String result = func.call().toString();
logger.error("result---"+result);
打印结果为:result---hello, sky
有参(参数为字符串数据)lua函数
String luaFileName = getClass().getClassLoader().getResource("hello.lua").toURI().getPath();
Globals globals = JsePlatform.standardGlobals();
LuaValue transcoderObj = globals.loadfile(luaFileName).call();
LuaValue func = transcoderObj.get(LuaValue.valueOf("test"));
String result = func.call(LuaValue.valueOf("sky")).toString();
logger.error("result---"+result);
打印结果为:result---the parameter is sky
返回一个lua对象的lua函数
String luaFileName = getClass().getClassLoader().getResource("hello.lua").toURI().getPath();
Globals globals = JsePlatform.standardGlobals();
LuaValue transcoderObj = globals.loadfile(luaFileName).call();
LuaValue func = transcoderObj.get(LuaValue.valueOf("getInfo"));
LuaValue hTable = func.call();
//解析返回来的table,这里按照格式,一个个参数去取
String userId = hTable.get("userId").toString();
LuaTable servicesTable = (LuaTable)CoerceLuaToJava.coerce(hTable.get("services"), LuaTable.class);
List<String> servciesList = new ArrayList<>();
for (int i = 1; i <= servicesTable.length(); i++) {
int length = servicesTable.get(i).length();
StringBuilder service = new StringBuilder();
for (int j = 1; j <= length; j++) {
service.append(servicesTable.get(i).get(j).toString());
}
servciesList.add(service.toString());
}
logger.error("userId:"+userId);
logger.error("servcies:"+servciesList);
打印结果为:
userId:9999
servcies:[-eat-drink, -eat2-drink2]
传入一个java对象到lua函数
String luaFileName = getClass().getClassLoader().getResource("hello.lua").toURI().getPath();
Globals globals = JsePlatform.standardGlobals();
LuaValue transcoderObj = globals.loadfile(luaFileName).call();
LuaValue func = transcoderObj.get(LuaValue.valueOf("readInfo"));
//CoerceJavaToLua.coerce(javaObject) 经测试,可以直接调用该方法
//将一个java对象转化为luaValue,但是嵌套model情况下的java对象转
//换有问题,因此这里直接使用LuaValue手动去包装
LuaValue luaValue = new LuaTable();
luaValue.set("userId", "11111");
String userId = func.invoke(luaValue).toString();
logger.error("userId:"+userId);
打印结果为:
userId:11111