在本文中,我们将详细介绍lua学习笔记3android调用LuaLua脚本使用LoadLib回调Java,并传多个参数的各个方面,并为您提供关于lua调用安卓api的相关解答,同时,我们也将为您带来关
在本文中,我们将详细介绍lua学习笔记 3 android调用LuaLua脚本使用LoadLib回调Java,并传多个参数的各个方面,并为您提供关于lua调用安卓api的相关解答,同时,我们也将为您带来关于(使用lua++)Lua脚本和C++交互(三)、android使用lua脚本实现动态逻辑、java – 使用luaj将参数传递给lua函数、Java调用Lua脚本(热载实现)的有用知识。
本文目录一览:- lua学习笔记 3 android调用LuaLua脚本使用LoadLib回调Java,并传多个参数(lua调用安卓api)
- (使用lua++)Lua脚本和C++交互(三)
- android使用lua脚本实现动态逻辑
- java – 使用luaj将参数传递给lua函数
- Java调用Lua脚本(热载实现)
lua学习笔记 3 android调用LuaLua脚本使用LoadLib回调Java,并传多个参数(lua调用安卓api)
lua学习笔记 3 android调用Lua。Lua脚本使用LoadLib回调Java,并传多个参数
可以在Java中接收多个参数,并显示每一个参数
android 中的调用,加载Lua脚本的方法, 不是本篇的重点略,可以参考本博前面的笔记。
Lua脚本:
function callback() luajava.loadLib("cn.hpc.common.lua.LoadLibExample","open")-- 调用cn.hpc.common.lua包中的LoadLibExample类的 open方法。 javaObjcet.methodopen("1",4) -- 返回 两个参数 javaObjcet.methodopen("2","blog","http://blog.csdn.net/hpccn") --返回 3 个参数 javaObjcet.methodopen("3","不同的参数","http://blog.csdn.net/hpccn") end
回调的接口
测试中只是简单的输出从Lua传入的参数。
包名:cn.hpc.common.lua
类名:LoadLibExample
方法名: open
package cn.hpc.common.lua; import org.keplerproject.luajava.JavaFunction; import org.keplerproject.luajava.LuaException; import org.keplerproject.luajava.LuaState; public class LoadLibExample { public static int open(LuaState L) throws LuaException { L.newTable(); L.pushValue(-1); L.setGlobal("javaObjcet"); L.pushString("methodopen"); L.pushJavaFunction(new JavaFunction(L) { public int execute() throws LuaException { for (int i = 0,count = L.getTop() + 1; i < count; ++i) { System.out.println(getParam(i)); } return 0; } }); L.setTable(-3); return 1; } }
运行结果,Log输出:
11-19 11:12:32.783: I/System.out(4137): Userdata 11-19 11:12:32.783: I/System.out(4137): cn.hpc.common.lua.LoadLibExample$1@2bc48890 11-19 11:12:32.793: I/System.out(4137): 1.0 11-19 11:12:32.793: I/System.out(4137): -4.0 11-19 11:12:32.793: I/System.out(4137): Userdata 11-19 11:12:32.793: I/System.out(4137): cn.hpc.common.lua.LoadLibExample$1@2bc48890 11-19 11:12:32.793: I/System.out(4137): 2.0 11-19 11:12:32.793: I/System.out(4137): blog 11-19 11:12:32.793: I/System.out(4137): http://blog.csdn.net/hpccn 11-19 11:12:32.793: I/System.out(4137): Userdata 11-19 11:12:32.793: I/System.out(4137): cn.hpc.common.lua.LoadLibExample$1@2bc48890 11-19 11:12:32.803: I/System.out(4137): 3.0 11-19 11:12:32.803: I/System.out(4137): 不同的参数 11-19 11:12:32.803: I/System.out(4137): http://blog.csdn.net/hpccn
(使用lua++)Lua脚本和C++交互(三)
总结
以上是小编为你收集整理的(使用lua++)Lua脚本和C++交互(三)全部内容。
如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。
android使用lua脚本实现动态逻辑
这是一个简单的执行lua脚本的android例子。
可以输入脚本,
可以查看到执行效果。
已经fork到我的github
请移步 https://github.com/zhengpanyong/AndroLua
java – 使用luaj将参数传递给lua函数
String script = "print 'Hello World!'"; InputStream input = new ByteArrayInputStream(script.getBytes()); Prototype prototype = LuaC.compile(input,"script"); LuaValue globals = JsePlatform.standardGlobals(); LuaClosure closure = new LuaClosure(prototype,globals); closure.call();
但是现在我正在尝试一个带有顶级函数的lua脚本,该函数接受一个参数而我无法弄清楚如何从Java中传入参数.这是我到目前为止所得到的:
String script = "function something(argument)\n"+ "test_string = 'Hello World!'\n"+ "print(test_string)\n"+ "print(argument)\n"+ "end"; InputStream input = new ByteArrayInputStream(script.getBytes()); Prototype prototype = LuaC.compile(input,globals); closure.invokemethod("something",CoerceJavaToLua.coerce("Foo"));
这会导致invoke方法行出现异常:
org.luaj.vm2.LuaError: attempt to index ? (a function value)
谢谢你的帮助!
解决方法
例如,这个代码在luaj-3.0-beta1中
String script = "argument = ...\n"+ "test_string = 'Hello World!'\n"+ "print(test_string)\n"+ "print(argument)\n"; Globals globals = JsePlatform.standardGlobals(); LuaValue chunk = globals.loadString(script,"myscript"); chunk.call( LuaValue.valueOf("some-arg-value") );
为我制作了这个结果:
Hello World! some-arg-value
您可以通过这种方式传递任意数量的参数.
Java调用Lua脚本(热载实现)
前言:
Lua作为解析执行的脚本语言, 往往是易变逻辑编写的首选语言, 尤其是在游戏领域. C/C++和Lua的结合, 往往了标配. 比如Redis, Nginx其对Lua的支持, 也是杠杠的. 当然Lua也可以作为规则引擎中的规则编写语言. 本文对Java调用Lua(Luaj)的实现机制, 做下简单的介绍.
Luaj简介:
Luaj是Java调用Lua的一种实现方式, 其是构建一个虚拟机解析执行Lua脚本来实现的, 这和Groovy的方式有所不同.
这是Luaj的官网, http://www.luaj.org/luaj/3.0/README.html.
它是针对5.2.x的lua版本的解析器, 其Luaj库的编写是通过JavaCC来实现的.
简单示例:
集合Luaj, 可以通过Maven进行如下配置:
<dependency>
<groupId>org.luaj</groupId>
<artifactId>luaj-jse</artifactId>
<version>3.0.1</version>
</dependency>
Luaj的一个简单的示例程序:
import org.luaj.vm2.Globals;
import org.luaj.vm2.LuaValue;
import org.luaj.vm2.lib.jse.JsePlatform;
public class TestLuaJ {
public static void main(String[] args) {
String luaStr = "print ''hello,world!''";
Globals globals = JsePlatform.standardGlobals();
LuaValue chunk = globals.load(luaStr);
chunk.call();
}
}
注: Globals继承LuaValue对象,LuaValue对象用来表示在Lua语言的基本数据类型,比如:Nil,Number,String,Table,userdata,Function等。尤其要注意LuaValue也表示了Lua语言中的函数。所以,对于Lua语言中的函数操作都是通过LuaValue来实现的.
其输出的结果:
hello,world!
原理初探:
根据官方的说法, Luaj在包装执行具体的Lua代码时, 有三种不同的模式.
1). 纯脚本解析执行(不选用任何Compiler)
2). To Lua字节码(LuaC, lua-to-lua-bytecode compiler)
3). To Java字节码(LuaJC, lua-to-java-bytecode compiler)
其中LuaC是默认的选用Compiler.
依据官方的介绍:
不使用LuaC的方法是, 则不调用如何行:
org.luaj.vm2.compiler.LuaC.install(globals);
而使用LuaJC的方法, 则是调用
org.luaj.vm2.jse.luajc.LuaJC.install(globals);
可惜, 笔者在自己测试过程中, 遇到了异常(org.luaj.vm2.LuaError: No compiler.), 好尴尬:
性能评估:
对Lua解析的代码进行简单的性能评估:
其对同样的逻辑代码:
int a = 0;
for ( int i = 0; i < 10000; i++ ) {
a = a + i;
}
执行10000次, 具体对比耗时值.
整体的测试代码如下:
import org.luaj.vm2.Globals;
import org.luaj.vm2.LuaValue;
import org.luaj.vm2.lib.jse.JsePlatform;
public class TestLuaJPerf {
public static void main(String[] args) {
int iterNum = 10000;
// *) java 模式运行
long beg = System.currentTimeMillis();
for ( int j = 0; j < iterNum; j++ ) {
int a = 0;
for ( int i = 0; i < 10000; i++ ) {
a = a + i;
}
}
long end = System.currentTimeMillis();
System.out.println(String.format("Java consume: %dms", end - beg));
// *) Lua脚本解析执行
String luaStr = "a = 0; for i = 0, 10000, 1 do a = a + i; end";
Globals globals = JsePlatform.standardGlobals();
LuaValue chunk = globals.load(luaStr);
beg = System.currentTimeMillis();
for ( int i = 0; i < iterNum; i++ ) {
chunk.call();
}
end = System.currentTimeMillis();
System.out.println(String.format("Lua consume: %dms", end - beg));
}
}
测试结果如下:
Java consume: 10ms
Lua consume: 10249ms
几乎1000倍的差异, 这个性能对比, 差异有些大, Lua确实慢的不止半点(可能和Luaj的具体实现也有些关系), 因此从这方面来说, Java+Groovy的结合, 比Java+Lua的结合更有优势.
线程安全:
Luaj中的Globals对象不是线程安全的, 因此最佳实践是每个线程一个Globals对象.
事实上, 可以采用ThreadLocal的方式来存储该对象.
因为是对象, 而不是Class, 其和Groovy编译的Script类, 其实现思路是本质区别的.
总结:
个人对Luaj的认识还是有些肤浅, 没有深入地去研究, 所以可能这边的一些结论可能不准确. 同时Luaj对Lua脚本的支持, 到什么程度, 其实也是一个问号. 不管怎么样, 能对Luaj能有一个初步的认识, 也是好事.
关于lua学习笔记 3 android调用LuaLua脚本使用LoadLib回调Java,并传多个参数和lua调用安卓api的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于(使用lua++)Lua脚本和C++交互(三)、android使用lua脚本实现动态逻辑、java – 使用luaj将参数传递给lua函数、Java调用Lua脚本(热载实现)的相关信息,请在本站寻找。
本文标签: