`
univasity
  • 浏览: 809973 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

[LUA]几个简单的luajava使用例子

阅读更多

代码来个人和自网络,仅供参考,如有纰漏请指正,欢迎交流。

 

01. 在AWT中的使用(来自文章《Java中使用Lua脚本语言 》)

<!--StartFragment-->/////////////////////////////////////////////////////

// Hello.java
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.lua
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)
 

 

 02. 在SWT中的使用(本人写的一个小例子)

/////////////////////////////////////////////////////

// Hello.java

 

 

public class Hello {

 /**
  * @param args
  */
 public static void main(String[] args) {
//  Display display = new Display();
//  Shell shell = new Shell(display);
//  shell.setLayout(null);
//  Text hello = new Text(shell, SWT.MULTI);
//  shell.setText("Java应用程序");
//  shell.setSize(200, 100);
//  hello.setText("Hello,SWT World!");
//  hello.pack();
//  shell.open();
//  while(!shell.isDisposed()){
//   if(!display.readAndDispatch()){
//    display.sleep();
//   }
//  }
//  display.dispose();
  
  LuaState L = LuaStateFactory.newLuaState();
  L.LdoFile("res/hello.lua");
  L.close();
 }

}

 --------------------------------------------------------------

-- hello.lua

--
-- create instance
--
display = luajava.newInstance("org.eclipse.swt.widgets.Display") -- Display

shell = luajava.newInstance("org.eclipse.swt.widgets.Shell",display) -- Shell

SWT = luajava.bindClass("org.eclipse.swt.SWT") -- SWT

text = luajava.newInstance("org.eclipse.swt.widgets.Text", shell,SWT.MULTI) -- Text

--
-- init state
--
shell:setText("Java应用程序")
shell:setSize(200, 100)
text:setText("Hello SWT World!")
text:pack()
shell:open()

--
-- loop
--
while not shell:isDisposed() do
 if not display:readAndDispatch() then
  display:sleep()
 end
end
display:dispose() 

 

 

03. 网上找到的一个例子

<!--StartFragment-->////////////////////////////////////////////////////

// IBusinessLogic.java
public interface IBusinessLogic {
 public void doLogic ();
}
  
----------------------------------------------------
-- LuaLogic.lua
local logic = {}
function logic.doLogic ()
 print("hello from logic written in Lua")
end
return logic
  
/////////////////////////////////////////////////////
// LuaJavaTest.java
public class LuaJavaTest {
 
public static void main(String[] args) throws ClassNotFoundException, LuaException {
      LuaState l = LuaStateFactory.newLuaState();
      l.openLibs();

      l.LdoFile("res/LuaLogic.lua");
      
      LuaObject logic = l.getLuaObject("logic");
      IBusinessLogic jlogic = (IBusinessLogic) (logic.createProxy("IBusinessLogic"));
      jlogic.doLogic();
      
      l.pop(1);
}
  
04.数值和对象传递的一个例子(参考自 http://hi.baidu.com/lff0305/blog/item/fd666931da276111eac4af45.html )
-----------------------------------------
-- test01.lua
function sum(a, b)
 return a+b
end
function test1(v)
 v:init()
end
 
/////////////////////////////////////////////////////
// Test01.java
public class Test01 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		
		LuaState L = LuaStateFactory.newLuaState();
		// 加载lua标准库,否则一些lua基本函数无法使用
		L.openLibs();
		// doFile
		L.LdoFile("res/test01.lua");
		
		//---------------------------------------------值传递测试
		// 找到函数 sum
		L.getField(LuaState.LUA_GLOBALSINDEX, "sum");
		
		// 参数1压栈
		L.pushNumber(100);
		
		// 参数2压栈
		L.pushNumber(50);
		
		// 调用,共2个参数1个返回值
		L.call(2, 1);
		
		// 保存返回值到result中
		L.setField(LuaState.LUA_GLOBALSINDEX, "result");
		
		// 读入result
		LuaObject lobj = L.getLuaObject("result");
		// 打印结果 
		System.out.println(lobj.getNumber());
		
		//---------------------------------------------对象传递测试
		Value v = new Value();
		
		L.getField(LuaState.LUA_GLOBALSINDEX, "test1");
		
		try {
			L.pushObjectValue(v);
		} catch (LuaException e) {
			e.printStackTrace();
		}
		
		L.call(1, 0);
		
		v.print();
	}

}

class Value {
	private int i;
	
	public void init(){
		i = 111;
	}
	
	public void print(){
		System.out.println(i);
	}
	
}
 
  • luaInJava.rar (116.1 KB)
  • 描述: 部分例子源代码
  • 下载次数: 348
分享到:
评论
7 楼 liyunbang08 2012-08-02  
liyunbang08 写道
PANIC: unprotected error in call to Lua API (attempt to call a nil value)

运行出错,请问下什么是什么问题?

搞定、眼拙写错路径。
6 楼 liyunbang08 2012-08-02  
PANIC: unprotected error in call to Lua API (attempt to call a nil value)

运行出错,请问下什么是什么问题?
5 楼 liyunbang08 2012-08-02  
liyunbang08 写道
Value v = new Value();
LZ问下这个value是哪个包的?

额 看到,是内部类。。。
4 楼 liyunbang08 2012-08-02  
Value v = new Value();
LZ问下这个value是哪个包的?
3 楼 univasity 2012-02-29  
Smile__LV 写道
LZ啊  你这是什么IDE 什么开发环境啊 工程eclipse导入不了啊

我用的就是eclipse啊,J2EE版本。导入后提示什么错误?
2 楼 Smile__LV 2012-02-27  
LZ啊  你这是什么IDE 什么开发环境啊 工程eclipse导入不了啊
1 楼 相似的悲哀 2011-12-28  
这几天一直在纠结一个问题,怎么从lua中获取table里的值呢??

相关推荐

    Lua5.0中文参考

    - **游戏开发**:Lua被广泛用于游戏开发领域,著名的例子之一就是《魔兽世界》使用Lua作为脚本语言来实现游戏逻辑。这证明了Lua不仅易于使用,而且在复杂应用中也能表现出色。 #### 四、Lua的语法特点 - **简洁性**...

    tts_tencent_cloud.lua

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

    3个3D的RPG游戏例子

    这些元素分别涉及了以下几个知识点: 1. **JFreeChart**:这是一个用于Java的开源报表组件,可以生成各种图表,例如柱状图、饼图、线图等,常用于数据分析和展示。 2. **进程管理**:描述中提到的“进程杀不掉的...

    javasrcipt v8 脚本实现代码

    V8引擎的实现主要涉及以下几个方面: 1. **即时编译(JIT)**:V8引擎在运行时将JavaScript代码编译成机器码,这个过程分为两个阶段——静态单赋值形式(SSA)中间表示和优化编译。SSA帮助减少数据依赖性,优化编译...

    Jedis-showcase-源码

    在Jedis-showcase项目中,我们通常会看到以下几个关键模块: 1. **连接管理**:Jedis-showcase展示了如何创建和管理Jedis实例。这包括了连接池的配置,例如使用`JedisPoolConfig`来定制连接池参数,以及如何通过`...

    socket-client.zip

    在安卓应用中实现TCP套接字通信,通常涉及以下几个关键步骤: 1. **创建Socket对象**:使用`java.net.Socket`类创建一个socket实例,指定服务器的IP地址和端口号。例如: ```java Socket socket = new Socket(...

    用注解实现redis分布式锁,防止短时间内重复请求

    Redis提供了几个关键操作,如`SETNX`(Set if Not eXists)、`EXPIRE`(设置过期时间)和`GETSET`(原子性地获取并设置值),这些操作可以用来构建一个简单的分布式锁。下面是一个基本的流程: 1. **获取锁**:当...

    redis-service JavaDoc

    在Redis-Service JavaDoc中,你可以找到以下几个关键的知识点: 1. **Redis客户端连接**:文档会涵盖如何创建和管理与Redis服务器的连接。这通常涉及使用如Jedis或Lettuce这样的Java客户端库,包括初始化配置、连接...

    java种菜源码-autofill-arrays:快速轻松地填充数组和其他集合

    这个插件允许你通过输入几个键来用有趣/有意义的单词或数字列表填充Arrays 。 您可以从多个可用类别中进行选择。 它适用于所有主流编程语言,如Python 、 Javascript 、 Java 、 C 、 C++ 、 C# 、 Lua 、 Ruby等。...

    java种菜源码-autofill-arrays-vc:快速轻松地填充数组和其他集合

    这个插件允许你通过输入几个键来用有趣/有意义的单词或数字列表填充Arrays 。 您可以从多个可用类别中进行选择。 它适用于所有主流编程语言,如Python 、 Javascript 、 Java 、 C 、 C++ 、 C# 、 Lua 、 Ruby等。...

    python创建cocos2d-x项目代码

    此脚本通常包含以下几个主要部分: 1. **参数解析**:使用 Python 的 `argparse` 库来处理命令行参数。 2. **模板生成**:根据指定的参数生成项目结构和相应的文件。这可能涉及到模板引擎(如 Jinja2)来生成代码...

    小游戏源码-变态方块游戏,纯粹找虐.rar

    一个完整的游戏源码项目通常会包含以下几个关键部分: 1. **主程序代码**:这是游戏的核心,包含游戏逻辑、玩家交互、游戏循环和事件处理等功能。 2. **图形资源**:包括游戏界面、角色、背景、动画等图像文件,...

    redis的jar包

    在Java项目中,为了使用Redis,我们需要将这两个jar包添加到项目的类路径中。这样,我们就可以在代码中创建Jedis实例,通过连接池获取和归还连接,执行Redis命令。例如: ```java import redis.clients.jedis.Jedis...

    nginx+redis实现session共享

    实现过程主要包括以下几个步骤: 1. 配置Nginx:在Nginx的配置文件中,我们需要设置反向代理规则,将所有需要session共享的请求指向同一组后端服务器,并开启session亲和性(sticky session),确保用户的后续请求...

Global site tag (gtag.js) - Google Analytics