文档章节

Java调用Lua

ksfzhaohui
 ksfzhaohui
发布于 2016/12/08 23:03
字数 1051
阅读 1092
收藏 18
点赞 1
评论 3

前言
最近一款游戏开发中,客户端基于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本身比较熟悉。

© 著作权归作者所有

共有 人打赏支持
ksfzhaohui

ksfzhaohui

粉丝 302
博文 128
码字总数 158547
作品 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
quick-cocos2d-x 接入支付宝(android)

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

小房小田
2014/09/23
0
7
Quick-x中luajavabridge示例代码中一个小问题

Quick-x提供的luaj非常好用,很简单的实现了Lua调用Java的功能,平台也提供了一个Luajavabridge示例,按照例子可以很快的掌握调用方法。 不过,在使用过程中,发现在某些Android机器上,在调...

SunLightJuly
2014/02/18
0
4
自己写的 根据编码搜索文件的小工具

文件、目录搜索的小工具 用正则式限制文件名、关键字、目录 开始是专门为了搜索GBK和UTF8两种编码的文件,现在可以制定多种编码方式来搜索文件 本科生,代码可能很不规范 因为windows下好像没...

天地一MADAO_
2014/11/07
0
10
kahlua java上的lua脚本介绍及性能测试

kahlua是一款基于CLDC1.1且非常小巧的Lua解释器,它很容易扩展。只需要配合一个Lua编译器,就可以执行编译后的Lua源代码。 也可以用在j2se上,而且速度还非常快!!支持把lua文件的编译执行,...

JavaGG
2010/05/24
0
2
搭建Cocos Code IDE开发环境

Cocos Code IDE是Cocos2d-x团队开发的,用于开发Cocos2d-JS和Cocos2d-x Lua绑定的游戏工具,它是基于Eclipse[ Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是...

智捷课堂
2015/05/05
0
0
记录,cocos2d-x 安装

Last login: Tue Sep 4 09:14:53 on console wucy:~ wucy$ java -version java version "1.6.0_26" Java(TM) SE Runtime Environment (build 1.6.0_26-b03-383-11D2001) Java HotSpot(TM) 64......

扶殊88
2012/09/08
0
0
hi-nginx-1.4.8 正式发布,新增一组命令

hi-nginx-1.4.8正式发布。 更新: nginx升级至1.14.0 升级hi-project脚本,创建工程更灵活方便 支持java 10 添加hiluapackagepath 和 hiluapackagecpath 命令. 添加三个缓存控制命令:hinee...

所以呢
05/09
0
0
[架构设计]反向(或者后向)插件系统设计

反向(或者后向)插件系统与正向(或者前向)插件系统是一对概念相对的设计模式。正向插件系统是指系统架构的时候预先定义好一系列用于某种特定目的的函数族,然后通过共享库的形式封装不同的...

梁欢
2014/06/25
0
0
Java中的script引擎在游戏中的使用

首先查看一下jvm当前支持了哪些脚本引擎,当前使用的是jdk6版本 ScriptEngineManager scriptEngineManager = new ScriptEngineManager();List<ScriptEngineFactory> engineFactories = scri......

ksfzhaohui
2015/11/07
0
2

没有更多内容

加载失败,请刷新页面

加载更多

下一页

TensorFlow 作用域与操作符的受限范围

variable_scope 影响变量和操作符 name_scope 只影响操作符 with tf.name_scope(""),使用空字符串将作用域返回到顶层 tf.variable_scope("") 相当于添加一个空层 import tensorflow as tf...

阿豪boy
5分钟前
0
0
Java面试基础篇——第六篇:常见Map类的区别

常见的map类有: HashMap, ConcurrentHashMap (Jdk1.8) , LinkedHashMap, TreeMap, Hashtable。 其中我们最常用的莫过于HashMap, 和并发情况下使用的ConcurrentHashMap了,它们的主要区别就在...

developlee的潇洒人生
7分钟前
0
0
崛起于Springboot2.X之前端模版freemaker(23)

1、配置文件 spring: freemarker: allow-request-override: false cache: true check-template-location: true charset: UTF-8 content-type: text/html ......

木九天
23分钟前
1
0
spring-boot:run启动时,指定spring.profiles.active

Maven启动指定Profile通过-P,如mvn spring-boot:run -Ptest,但这是Maven的Profile。 如果要指定spring-boot的spring.profiles.active,则必须使用mvn spring-boot:run -Drun.profiles=test......

夜黑人模糊灬
25分钟前
0
0
大数据分析挖掘技术学习:Python文本分类

引言 文本分类作为自然语言处理任务之一,被广泛应用于解决各种商业领域的问题。文本分类的目的是将 文本/文档 自动地归类为一种或多种预定义的类别。常见的文本分类应用如下: • 理解社交媒...

加米谷大数据
30分钟前
0
0
istio-0.8 指标监控,prometheus,grafana

配置: https://istio.io/docs/tasks/telemetry/metrics-logs/ https://istio.io/docs/tasks/telemetry/tcp-metrics/ envoy拦截请求>上报mixer>对接prometheus>grafana 效果截图: promethe......

xiaomin0322
31分钟前
0
0
公众号推荐

阿里技术 书籍:《不止代码》

courtzjl
34分钟前
0
0
关于改进工作效率

1.给不同的业务线建立需求群,所有的数据需求都在群里面提。 2.对于特别难搞定的事情,到对应的技术哪去做,有问题随时沟通。 3.定期给工作总结形成方法论。 4.学习新的技术,尝试用新的方法...

Avner
41分钟前
0
0
关于thinkphp 框架开启路径重写,无法获取Authorization Header

今天遇到在thinkphp框架中获取不到header头里边的 Authorization ,后来在.htaccess里面加多一项解决,记录下: <IfModule mod_rewrite.c> Options +FollowSymlinks -Multiviews Rewrite......

殘留回憶
45分钟前
0
0
centos 使用yum安装nginx后如何添加模块 10

centos 使用yum安装nginx后如何添加模块 10 centos6.2版本,使用yum来安装了nginx,但是最近需要重新添加模块,所以就傻了,询问下有人知道怎么重新添加模块吗? PS:俺是新手,需要高手救助...

linjin200
48分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部