文档章节

Java调用Lua

ksfzhaohui
 ksfzhaohui
发布于 2016/12/08 23:03
字数 1051
阅读 1128
收藏 18

前言
最近一款游戏开发中,客户端基于lua语言开发,为了方便客户端调用原型数据,所有的原型数据都以lua表格的形式存放;对于服务器端的java语言就需要解析出lua中的数据, 转换为java对象。

桥接的选择
网上大致搜索了一下,用的比较广泛的是下面这两款:
1.luajava 官网:http://luaforge.net/projects/luajava/
2.luaj 官网:http://www.luaj.org/luaj/3.0/README.html

看luajava的官网上支持的lua写的是lua5,lua现在的最新版本已经到5.3了,应该是好久没有更新了,同时也可以看github上的源码luajava,最近的一次改动是在3年前;相比较luaj虽然没有提供最新的lua5.3支持,但是已经提供到了lua5.2的支持,明显更加活跃。
另外一点就是luajava在使用中是依赖于dll(动态链接库)的,而luaj是纯java语言

综上最终选择luaj作为桥接器
maven引入:

<dependency>
    <groupId>org.luaj</groupId>
    <artifactId>luaj-jse</artifactId>
    <version>2.0.3</version>
</dependency>

实例
1.准备一个存放数据的lua文件TbTest.lua,存放路径D:/Data

TbTest = {
      [1] = {1,[[name1]],{1,2},
      },
      [2] = {2,[[name2]],
      },
}

准备了一张表数据,里面准备了int类型,string类型以及table类型

2.提供lua对外的接口LuaToJavaBridge.lua

LuaToJavaBridge = {}

function LuaToJavaBridge.getData(dbName,dataId,fieldIndex)
     require(dbName)
     local dbData=_G[dbName]
     
     local lineData=dbData[dataId]
     return lineData[fieldIndex]
end

提供了一个lua类LuaToJavaBridge,方法getData的3个参数分别是:表名,表Id和字段编号
require(dbName) 引入需要的lua文件

3.提供一个java调用lua的类JavaToLuaBridge

import org.luaj.vm2.LuaTable;
import org.luaj.vm2.LuaValue;
import org.luaj.vm2.lib.jse.JsePlatform;

public class JavaToLuaBridge {

    private static LuaValue javaToLua;

    private JavaToLuaBridge() {

    }

    public static void init(String packagePath, String javaToLuaFile,
            String javaToLuaClass) {
        LuaValue _G = JsePlatform.standardGlobals();
        _G.get("package").set("path", packagePath);

        _G.get("dofile").call(LuaValue.valueOf(javaToLuaFile));
        javaToLua = _G.get(javaToLuaClass);
    }

    public static LuaValue getData(String dbName, int dataId, int fieldIndex) {
        LuaValue result = javaToLua.get("getData").call(
                LuaValue.valueOf(dbName), LuaValue.valueOf(dataId),
                LuaValue.valueOf(fieldIndex));
        return result;
    }
}

init方法,提供一个lua的运行环境,lua是弱语言,所有传递给lua,或者从lua获取的都是LuaValue对象
_G.get(“package”).set(“path”, packagePath); 用来设置lua数据的位置,这里可以设置成D:/Data/?.lua
_G.get(“dofile”).call(LuaValue.valueOf(javaToLuaFile));获取dofile的对象,然后加载LuaToJavaBridge.lua文件
最后获取LuaToJavaBridge.lua文件中的类文件

4.测试

public static void main(String[] args) {
        JavaToLuaBridge.init("D:/Data/?.lua", "LuaToJavaBridge.lua",
                "LuaToJavaBridge");

        int id = JavaToLuaBridge.getData("TbTest", 1, 1).checkint();
        String name = JavaToLuaBridge.getData("TbTest", 1, 2).checkjstring();

        LuaTable table = JavaToLuaBridge.getData("TbTest", 1, 3).checktable();
        int len = table.length();
        for (int i = 1; i <= len; i++) {
            int tv = table.get(i).checkint();
            System.out.println(tv);
        }
        System.out.println("id = " + id + ",name = " + name);
    }

首先初始化,然后获取数据文件中的数据,对于int和string类型,分别调用checkint()和checkjstring()方法转化为对于的java类型;对于table类型需要checktable(),需要注意的是所有的lua表下标都是从1开始的。

在此期间遇到一个问题,让我迷惑了半天,刚刚还运行好好的,不一会就报下面这个错了:

Exception in thread "main" org.luaj.vm2.LuaError: LuaToJavaBridge.lua:1: unexpected symbol
    at org.luaj.vm2.LuaValue.error(Unknown Source)
    at org.luaj.vm2.lib.BaseLib$BaseLibV.invoke(Unknown Source)
    at org.luaj.vm2.lib.VarArgFunction.call(Unknown Source)
    at com.luaj.luajTest.JavaToLuaBridge.init(JavaToLuaBridge.java:20)
    at com.luaj.luajTest.JavaToLuaBridge.main(JavaToLuaBridge.java:32)

大意就是里面出现了意想不到的符号;
原因:使用了记事本进行修改,记事本修改后保存的lua文件只是UTF-8编码,但是一般来说,lua是不支持有BOM的,lua文件应该保存为UTF-8无BOM类型,而windows记事本的UTF-8是有BOM的,这就会造成错误。所以,文件存储时格式一般选择UTF-8无BOM格式
BOM: Byte Order Mark
UTF-8 BOM又叫UTF-8 签名,其实UTF-8 的BOM对UFT-8没有作用,是为了支援UTF-16,UTF-32才加上的BOM,BOM签名的意思就是告诉编辑器当前文件采用何种编码,方便编辑器识别,但是BOM虽然在编辑器中不显示,但是会产生输出,就像多了一个空行。

总结
总体来说使用起来还是挺方便的,以上只是一个简单的例子,涉及的数据类型也没有全,不过总体的结构可以参考一下;其实如果想更加熟练的使用luaj,还是要对lua本身比较熟悉。

© 著作权归作者所有

共有 人打赏支持
下一篇: 2PC/3PC到底是啥
ksfzhaohui

ksfzhaohui

粉丝 371
博文 140
码字总数 191478
作品 3
南京
高级程序员
私信 提问
加载中

评论(3)

ksfzhaohui
ksfzhaohui

引用来自“vimfung”的评论

引用来自“vimfung”的评论

用一下luascriptcore吧,我写的一个开源框架。支持java与lua的交互。^_^

可以在github上找到:https://github.com/vimfung/LuaScriptCore
好的,谢谢
vimfung
vimfung

引用来自“vimfung”的评论

用一下luascriptcore吧,我写的一个开源框架。支持java与lua的交互。^_^

可以在github上找到:https://github.com/vimfung/LuaScriptCore
vimfung
vimfung
用一下luascriptcore吧,我写的一个开源框架。支持java与lua的交互。^_^
五章 常用Lua开发库3-模板渲染

五章 常用Lua开发库3-模板渲染 博客分类: 跟我学Nginx+Lua开发 nginxlua 动态web网页开发是Web开发中一个常见的场景,比如像京东商品详情页,其页面逻辑是非常复杂的,需要使用模板技术来实...

epiclight
2015/06/07
0
0
java 调用lua 脚本实现

我想通过java去调用服务器上的一个lua 执行脚本,要实现java 向lua传参执行。

wangjie142
2015/08/08
1K
1
quick-cocos2d-x 接入支付宝(android)

quick-cocos2d-x 实现在lua里面完成android支付宝的接入 一、支付宝注册是很麻烦的一个过程,本文就不解释了,想了解的去官网看下注册流程。然后下载他们的sdk-WSSECUREPAY_SDK。 二、开始集...

小房小田
2014/09/23
0
7
java结合luaj实现服务中执行动态脚本

业务场景 我们都会碰到这样的情况,某某用户临时又增加新的校验规则需求,但是需求又很碎很急,没法等到下一个版本上线(想打人有木有),这种时候如果为了上线该改动需要重启服务,修改代码...

hotsmile
2018/08/09
0
0
php与redis并发大了,反应有点迟钝。。。。

网站前期采用php+java后端弄的,中间采用http通信,java输出的json 后来需求增加了,有活动出现,这个时候并发只有300左右,继续采用同步的话,java后端处理的时候,php端需要等待java的返回...

geminiblue
2014/10/04
14.5K
3

没有更多内容

加载失败,请刷新页面

加载更多

node调用dll

先安装python2.7 安装node-gyp cnpm install node-gyp -g 新建一个Electron-vue项目(案例用Electron-vue) vue init simulatedgreg/electron-vue my-project 在package.json中的scripts里添......

Chason-洪
5分钟前
0
0
Linux系统快速查找文件的技巧

Linux常用命令中,有些命令可以帮助我们查找二进制文件,帮助手册或源文件的位置,也有的命令可以帮助我们查找磁盘上的任意文件,今天我们就来看看这些命令如何使用。 which which命令会在P...

Linux就该这么学
7分钟前
0
0
dotConnect for Oracle入门指南(八):通过OracleCommand类使用存储过程

【下载dotConnect for Oracle最新版本】 dotConnect for Oracle(原名OraDirect.NET)建立在ADO.NET技术上,为基于Oracle数据库的应用程序提供完整的解决方案。它为设计应用程序结构带来了新的...

电池盒
8分钟前
0
0
JavaScript是如何工作的:深入类和继承内部原理 + Babel和TypeScript 之间转换

摘要: 深入JS系列15。 原文:深入类和继承内部原理 + Babel和TypeScript 之间转换 作者:前端小智 Fundebug经授权转载,版权归原作者所有。 这是专门探索 JavaScript 及其所构建的组件的系列...

Fundebug
18分钟前
0
0
js 引用传值问题踩坑

先自测一下,答案在最下边。 <html><head><script type="text/javascript" src="/jquery/jquery.js"></script><script type="text/javascript">$(document).ready(function(){$("button......

S三少S
29分钟前
11
1

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部