Java调用lua脚本-LuaJ

2017-10-31  本文已影响0人  转角的咖啡店

版权说明:本文由博主原创,转载请注明出处,多谢-转角的咖啡店

LuaJ介绍

Luaj 是一个 Java 的 Lua 解释器,基于 Lua 5.2.x 版本,目的是 :

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包下载地址:

  1. 黑鸭:http://10.90.50.148/d/component/search?q=LuaJ
  2. sourceforge:https://sourceforge.net/projects/luaj/
  3. 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

上一篇下一篇

猜你喜欢

热点阅读