美文网首页
Java调用lua脚本-LuaJ

Java调用lua脚本-LuaJ

作者: 转角的咖啡店 | 来源:发表于2017-10-31 15:58 被阅读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包下载地址:

    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

    相关文章

      网友评论

          本文标题:Java调用lua脚本-LuaJ

          本文链接:https://www.haomeiwen.com/subject/xiovpxtx.html