`

java中调用lua脚本语言1

    博客分类:
  • LUA
Lua 
阅读更多
Lua是一个实用的脚本语言,相对于Python来说,比较小巧,但它功能并不逊色,特别是在游戏开发中非常实用(WoW采用的就是Lua作为脚本的)。Lua在C\C++的实现我就不多说了,网上随便一搜,到处都是这方面的介绍,我想说的是如何在Java下使用Lua以提高编程效率、增强你的程序可扩展性。

首先,要在Java上使用Lua脚本,必须有关于Lua脚本解释器以及Java程序可以访问这些脚本的相关API,即相关类库。我使用的是一个叫做LuaJava的开源项目,可以在: http://www.keplerproject.org/luajava/ 找到LuaJava的类库以及源代码,使用文档资等

下载下来解压后包括两个文件(我下载的是1.1版本的): luajava-1.1.jar 文件和 luajava-1.1.dll动态连接库文件

luajava-1.1.jar就容易了,就是将其加入你的项目的ClassPath中,以便程序可以使用它提供的API

luaJava-1.1.dll就麻烦了,你必须将其加入你的Windows安装目录下,比如你用的是XP,安装在C盘,那就直接将其加入C:\WINDOWS目录下即可,当然你也可以将其加入你的JDK下的jre下,比如我的是C:\Program Files\Java\jdk1.6.0_20\bin

好了,现在你的项目就可以使用Lua脚本来实现动态扩展功能了!不过不要急,你还得有工具来写Lua脚本吧?不可能用记事本来写吧???????

你可以使用UltraEdit,但你用UE打开lua文件后,会发现和记事本差不多,并没有高亮(可能新版本的支持Lua脚本了),如果你的UE不支持,那么先去UltraEdit的官网下载支持Lua的Wordfiles文件(http://www.ultraedit.com/files/wf/lua.txt),是个文本文件(lua.txt)。打开UltraEdit安装目录下的wordfile.txt,把lua.txt文件中的内容拷贝粘贴到wordfile.txt的末尾,存盘,OK,于是UltraEdit语法高亮项多出Lua一项,可以选择使用了。其他语言的语法高亮支持与此类似。

但你如果是Java开发者,应该都用过Eclipse吧?可否在Eclipse下直接就写Lua脚本呢?答案是可以的!

这当然是Eclipse的强大的插件管理功能啦,你可以去下载luaeclipse插件来使你的Eclipse拥有编写Lua脚本的能力(既可以高亮显示你的脚本,是不是很爽呢),你可以在这里下载:http://www.ideais.com.br/luaeclipse/

下载后安装后,你的Eclipse就可以建立和编写Lua脚本了,注意设置一下首选项中关于LUA的属性(Eclipse安装插件就不用我说了吧????)

好了,现在一切都准备好了,让我们来一个HelloWorld吧!

首先在Eclipse先建立一个TestLua项目,然后编写如下程序:

import org.keplerproject.luajava.*;

public class Hello
{
    public static void main(String[] args)
    {
      LuaState L = LuaStateFactory.newLuaState();
      L.openLibs();    
      System.out.println("这里是Java程序调用Lua脚本");    
    
      // 加载脚本hello.lua,并执行
      L.LdoFile("res/hello.lua"); 
    }
}



好了,程序写完了,当然是保存为Hello.java咯,注意,这是Java代码!这是Java代码调用了一个叫hello.lua的脚本,下边是这个脚本文件的内容(你可以直接把他们复制到你的hello.lua文件中):

================================================================

--基本方法
print("您现在使用的是LUA脚本语言")
print("让我们一起来感受它的奇妙吧!\n")

--特点1,赋值
a={1,2}
b=a
print(a==b, a~=b)    --输出 true, false
a={1,2}
b={1,2}
print(a==b, a~=b)    --输出 false, true

--特点2,交换
a,b=1,2
a,b=b,a
print(a)
print(b)

print("连接".."字符串"..2^3)
print(type(2))

--while循环
i=0
print("while循环例子")
while i<5
do 
print(i);
i=i+1 
end

--repeat循环
i=0
print("repeat循环例子")
repeat
print(i)
i=i+1
until i>=5

--for循环
print("for循环例子")
for i=0,5,1
do
print(i)
end

T1={}
T1[1] = 10
print(T1[1])

function fun(a,b,...)
print(a)
print(b)
print(arg[1])
print(arg[2])
print(arg[3])
return
end

a,b=2,3
fun(a,b,200,400,500)


========================================================

好了,上边的脚本如果你不懂什么意思也没关系,直接运行一下吧

你可以执行编译执行那个Hello.java程序就可以了,就会看到如下的输出结果:

========================================================

这里是Java程序调用Lua脚本
您现在使用的是LUA脚本语言
让我们一起来感受它的奇妙吧!

true false
false true
2
1
连接字符串8
number
while循环例子
0
1
2
3
4
repeat循环例子
0
1
2
3
4
for循环例子
0
1
2
3
4
5
10
2
3
200
400
500

==========================================================


怎样,是不是很爽呢?觉得没意思?好,在来一段脚本吧:

frame = luajava.newInstance("java.awt.Frame", "Lua Java Console")
console = luajava.newInstance("java.awt.TextArea")
buttons_pn = luajava.newInstance("java.awt.Panel")
execute_bt = luajava.newInstance("java.awt.Button", "Execute")
clear_bt = luajava.newInstance("java.awt.Button", "Clear")
exit_bt = luajava.newInstance("java.awt.Button", "Exit")
frame:setSize(600,300)
buttons_pn:add(execute_bt)
buttons_pn:add(clear_bt)
buttons_pn:add(exit_bt)
BorderLayout = luajava.bindClass("java.awt.BorderLayout")
frame:add(BorderLayout.NORTH, console)
frame:add(BorderLayout.SOUTH, buttons_pn)
frame:pack()
frame:show()
--
-- Listeners
--
execute_cb = { 
actionPerformed = function(ev)
    print("execute")
    pcall(loadstring(console:getText()))
end
}
jproxy = luajava.createProxy("java.awt.event.ActionListener",execute_cb)
execute_bt:addActionListener(jproxy)

clear_cb = {actionPerformed= function (ev)
    print("clear");
    console:setText("");
end
}
jproxy = luajava.createProxy("java.awt.event.ActionListener" ,clear_cb)
clear_bt:addActionListener(jproxy)
exit_cb = { actionPerformed=function (ev)
print("exit")
    frame:setVisible(false)
    frame:dispose()
end
}

jproxyb = luajava.createProxy("java.awt.event.ActionListener" ,exit_cb)
exit_bt:addActionListener(jproxyb)
close_cb = {    }
function close_cb.windowClosing(ev)
    print("close")
    frame:setVisible(false)
    frame:dispose()
end
function close_cb.windowActivated(ev)
    print("act")
end
jproxy = luajava.createProxy("java.awt.event.WindowListener", close_cb)
frame:addWindowListener(jproxy)

这段脚本运行后你将会非常想进一步了解LUA的奥妙,至于什么我就不说了,你们自己运行看看吧。
分享到:
评论
2 楼 Memories_NC 2017-06-21  
本地lua脚本终于执行成功了,虽然不是通过redis
1 楼 完美天龙 2015-04-10  
有意思。顶一个。

相关推荐

    Java调用Lua脚本(LuaJava使用、安装及Linux安装编译)

    NULL 博文链接:https://chamcon.iteye.com/blog/1972995

    Java下执行Lua脚本工具LuaJava.zip

    LuaJava 是一款专门用于在java下执行lua脚本,该工具的主要目的是允许编写Lua脚本去操作Java组件,不需要任何声明以及任何的预处理。LuaJava 也允许Java去实现一个接口来调用Lua,这样任何的Lua相关接口功能都可以被...

    Lua脚本语言中文教程.pdf

    Lua中文教程 很简单的脚本编程语言 很容易与C/java等语言调用 比如大型游戏的剧情 还有安卓上的愤怒的小鸟便是用Lua写的 虽说是脚本年语言 但这种语言执行效率特别高 而且还特别简单方便

    Lua 学习教程 Android与Lua相互调用

    1、加载Lua脚本解析引擎。 2、以Native API方式调用引擎接口 直接以JNI方式调用Lua解析引擎的接口十分麻烦,开源项目LuaJava(https://github.com/mkottman/AndroLua )对这些JNI接口进行了很好的封装,它是一个...

    redis中使用java脚本实现分布式锁

    redis在2.6以后的版本中增加了Lua脚本的功能,可以通过eval命令,直接在RedisServer环境中执行Lua脚本,并且可以在Lua脚本中调用Redis命令。 使用脚本的好处: 1.减少网络开销:可以把一些要批量处理的功能,发在一个...

    上古世纪lua脚本加密解密工具-易语言

    这个工具是用来解包TX的上古世纪脚本的,调用了luac来进行...源码里我会附上游戏中的一个我已经修改过的lua脚本,是好友列表的lua脚本,加密后打入游戏即可cha询好友在地图上的位置。 未解密前的脚本: 解密后的脚本:

    Lua in Android

    在 Android 中使用 Lua 脚本,包含Lua脚本,全局变量,函数调用,Lua调用Java对象例子,有需要的下载

    tts_tencent_cloud.lua

    lua 脚本中调用腾讯云语音合成接口,可以将文本...腾讯云官网上有几种语言的demo,如java,Python , GO , C++ 等,但是没有lua脚本的例子,并且lua 中加密的使用,网络上信息量很少。这个脚本同时展示了lua的加密的使用

    阿里云javasdk源码-CocosLuaHotupdate:quick-cocos2dx-lua热更新模块代码+配套脚本工具

    更新时的背景和进度条资源路径不再写入src/config.lua内,而直接写死在loader/UpdateScene.lua,有变更需求时只需更新updater模块即可或者在preupdate.lua中直接对UpdateScene作调整修改(推荐后者) 本项目从修改而...

    starcore_for_winuwp.3.5.0.zip

    •集成脚本之间双向调用桥接,任何语言 c/c++, lua, python, java, c#,ruby可以直接存取和调用其它语言中的类,函数,方法,以及模块 •支持丰富的网络功能: tcp/udp, telnet server, http server, soap server. •...

    Programming_In_Lua.doc(word版本,带完整文档结构图)

    Lua很容易与C/C++、java、fortran、Smalltalk、Ada,以及其他语言接口。 ② 简单。Lua本身简单,小巧;内容少但功能强大,这使得Lua易于学习,很容易实现一些小的应用。他的完全发布版(代码、手册以及某些平台的二...

    分布式Redis原子操作示例

    分布式Redis原子操作示例,近期项目中遇到分布式项目中多节点大并发操作redis同一个key。此案例利用java调用LUA脚本实现redis操作的原子性。分享出来大家参考。

    Lua解析器mLua.zip

    requirerequire必须使用设置在java端的basedir为根目录的相对路径引用其他lua脚本:require "dir1/dir2/script1" require "script2"print支持输出一个或多个对象,但是不能将string与java对象作拼接:-- 正确的...

    luajsocket:Luajsocket是luasocket库中通往luaj的端口。 它允许在luaj vm中运行的lua脚本内部轻松进行套接字通信

    它允许在luaj vm中运行的lua脚本内部轻松进行套接字通信。 执照 Luajsocket是根据GNU通用公共许可证版本3发布的。 可以在COPYING文件中找到GNU通用公共许可证版本3的副本。 Luajsocket包含来自luasocket库的组件。...

    LuaJ-3.0.1

    Lua脚本与Java相互通信的工具类LuaJ,可实现Lua脚本与java的互相调用.

    AndroLua源码和演示例程

    AndroLua是移植到android平台上的lua解释器。 通过LuaJava.c, java通过该jni访问lua库函数。 本源码除了包含了全部AndroLua项目源码外,还演示了三个例子...1. 运行Lua脚本语句 2. 运行Lua脚本文件 3. 调用Android API

    jua:适用于Windows,Mac OS X,Linux,Android和iOS上的Java的LuaJIT

    这样,任何接口都可以在Lua中实现,并作为参数传递给任何方法,并且在调用时,等效函数将在Lua中调用,并将结果传递回Java。 快速开始 要将Nonlua包含到您的项目中,可以使用Maven或Gradle。 伪像: 核心: io....

    starcore_for_flutter:扑打其他脚本语言的中间件

    一个新的flutter插件项目,它支持flutter与其他脚本语言(例如python,java,ruby,golang,rust等)进行交互。它易于使用,支持android和ios平台。 starflut基于“ starcore-for-android”和“ starfore-for-ios...

    云的脚本引擎支持库1.0版(YunScript.fne)-易语言

    本支持库调用系统安装的ActiveX脚本引擎来解释执行相应的脚本代码,比如JAVA脚本(JavaScript)、VB脚本(VBScript)。 操作系统支持: Windows

    LuaJIT-ImGui:LuaJIT ffi绑定,用于imgui,后端和扩展小部件

    请从此repo文件夹执行以下操作: git submodule update --init --recursive编译linux cimgui_sdl(例如,对于love2d)需要: sudo apt install libsdl2-dev 从同级文件夹到仓库运行build目录中的脚本之一。...

Global site tag (gtag.js) - Google Analytics