当前位置: 首页 > 工具软件 > LuaJ > 使用案例 >

java调用 lua_Java调用lua脚本-LuaJ

宇文念
2023-12-01

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

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中引入

org.luaj

luaj-jse

3.0.1

Jar包下载地址:

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 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

 类似资料: