您当前的位置:钢材 > 钢绞线 > 价格汇总

lua源码解析,解析lua脚本

来源:头条 作者: chanong
分享到
关注德勤钢铁网在线:
  • 扫描二维码

    关注√

    德勤钢铁网微信

在线咨询:
  • 扫描或点击关注德勤钢铁网在线客服

简介如今,大多数在Java 中运行Lua 脚本的程序都使用Luajava。然而Luajava有一个严重的问题,它对字节数组和字符串一视同仁,使得反射效率相对较低。为了弥补这些问题,我引用了luajava,重写了它的Java和jni代码,并以mLua的名称重新发布。

功能描述与luajava类似。 mLua还包含全局lua函数,Java对象和lua对象可以通过JNI层代码进行交换。但是mLua禁止Lua直接操作Java对象,所以如果想在Lua中使用Java对象,就必须使用内置的全局函数。

mLua 区分字节数组和字符串。在mLua 中,Java 字节数组只是Lua 端的常规用户数据。

语言之间的数据交换过程中会复制字符串,因此当字符串从Lua传递到Java并在Lua中修改时,Java端对应的版本保持不变。

Lua端的数字传递给Java后,最初被解释为字节类型。否则,它尝试根据字节-短-整数-长-浮点-双链进行解释。

mLua 不向外界暴露Lua 解析器实例;所有操作都是基于MLua 实例完成的。

Java端方法描述MLua的Java端方法集中在MLua中。

方法名称方法说明setBasedir(String) 设置lua 代码的最外层目录。所有lua代码都应该存放在该目录或其子目录中。 PushGlobal(String, Object) 设置全局lua 全局变量或函数。您可以推送常规对象或JavaFunctions。

后者代表lua函数的Java实现。配置数据仅在执行start方法之前生成。

使用start(String)启动Lua解析器,传递的参数代表Lua代码入口文件。 Stop() 停止Lua 解析器并释放资源。

此外,JavaFunction 也是您需要使用的接口。这代表了lua函数的Java实现。其回调方法execute(Object[])传递Lua端输入的数据,并将结果输出到Lua端。如果方法本身不需要返回任何数据,则返回null即可。

Lua侧函数描述在mLua下,原有的Lua require和print函数都被重写了。

我需要

require必须使用Java端设置的basedir作为根目录的相对路径来引用其他lua脚本。

需要“dir1/dir2/script1” 需要“script2”

支持输出一个或多个对象,但不能组合字符串和Java对象。

-- 正确的做法--print(\'hello mLua\')print(\'context: \', getContext())print(\'string \' . 111) -- 错误的做法--print(\' context: \ ' . getContext()) 以逗号分隔的对象在Java 端以制表符分隔显示。

操作Java 对象

mLua也使用反射来操作Java对象,但是mobTools的ReflectHelper具有缓存功能,理论上每次都比luajava直接反射更快。 mLua 提供以下内置函数。

函数名称函数说明import(className) 将类导入ReflectHelper 类缓存。这个函数是

细绳。在后续代码中用于从缓存中检索导入的类实例。 import(name, className) 将类导入ReflectHelper 类缓存并使用此缓存键。

构造一个具有指定名称new(className,) 的Java 实例。参数className是导入函数的返回值。

后续参数是Java 构造函数方法invokeStatic(className, methodName,) 的输入参数。此方法调用Java 静态方法invoke(receiver, methodName,) 和Java 实例方法getStatic(className, fieldName)。 )获取Java。静态字段setStatic(className, fieldName, value) 设置java 静态字段。 get(receiver, fieldName) 获取Java 实例字段。 set(receiver, fieldName, value) 设置Java 实例字段。 createProxy(proxyTable, ) 构造一个Java 接口代理。参数proxyTable是一个Lua表。

key必须与Java接口类中的方法名相同,key对应:

value是一个Lua函数,函数的参数列表和返回值也是

必须与Java接口相同。 proxyTable后面的参数是实现的接口

列表名称(所有字符串)由导入函数返回。这个函数是

Java接口代理实例。它可以传递到Java端并进行操作。

mLua在调用实例中的接口函数时会调用proxyTable。

完成功能码对应的操作

Java 边代码示例

public class MainActivity extends Activity { private MLua lua; protected void onCreate(Bundle SavedInstanceState) { super.onCreate(savedInstanceState); //构造解析器实例lua=new MLua(); //设置Lua代码的保存位置lua .setBasedir ( \'/sdcard/mLua/LuaTest\'); //推送全局对象lua.pushGlobal(\'getContext\', new JavaFunction() { public Objectexecute(Object[] args) throws Throwable { return getApplication( ); } }); try { //启动解析器,设置main.lua为入口代码lua.start(\'main\'); } catch (Throwable e) { e.printStackTrace(); } } protected void onDestroy() { //关闭解析器lua.stop(); super.onDestroy(); }}lua 端代码

-- 导入ReflectHelper.ReflectRunnable 类并将其命名为ReflectRunnable --import(\'ReflectRunnable\', \'com.mob.tools.utils.ReflectHelper$ReflectRunnable\') 本地函数main() -- 打印并演示call - - print(\'来自mLua 的hello world\') local context=getContext() print(\'当前context: \', context) local packageName=invoke(context, \'getPackageName\') print(\ 'packageName: \ ', packageName) -- Java 接口代理演示-- local luaCode={ run=function(arg) print(\'luaCode.run(), input: \', arg) return \'yoyoyo\' end } local proxy=createProxy (luaCode , \'ReflectRunnable\') local res=invoke(proxy, \'run\', packageName) print(\'luaCode.run(), Output: \', res) -- 复制数组演示-- local bArray=new( \'[B\', 16) for i=0, 15 do set(bArray, \'[\' . i . \']\', i + 1) end local bArray2=new(\ '[B \', get(bArray, \'length\')) invokeStatic(\'System\', \'arraycopy\', bArray, 0, bArray2, 0, 16) for i=0, 15 do print( \'bArray2 [\' . i . \']: \', get(bArray2, \'[\' . i . \']\')) endendmain() 扩展子mLua只能加载lua通过以下方式从文件系统中获取:虽然这是默认代码,但您可以重写MLua 的setBasedir 方法并以不同的方式实现SourceLoader,以任何您想要的方式加载Lua 代码,包括资产和加密代码。

责任编辑:德勤钢铁网 标签:

热门搜索

相关文章

广告
德勤钢铁网 |价格汇总

lua源码解析,解析lua脚本

chanong

|

简介如今,大多数在Java 中运行Lua 脚本的程序都使用Luajava。然而Luajava有一个严重的问题,它对字节数组和字符串一视同仁,使得反射效率相对较低。为了弥补这些问题,我引用了luajava,重写了它的Java和jni代码,并以mLua的名称重新发布。

功能描述与luajava类似。 mLua还包含全局lua函数,Java对象和lua对象可以通过JNI层代码进行交换。但是mLua禁止Lua直接操作Java对象,所以如果想在Lua中使用Java对象,就必须使用内置的全局函数。

mLua 区分字节数组和字符串。在mLua 中,Java 字节数组只是Lua 端的常规用户数据。

语言之间的数据交换过程中会复制字符串,因此当字符串从Lua传递到Java并在Lua中修改时,Java端对应的版本保持不变。

Lua端的数字传递给Java后,最初被解释为字节类型。否则,它尝试根据字节-短-整数-长-浮点-双链进行解释。

mLua 不向外界暴露Lua 解析器实例;所有操作都是基于MLua 实例完成的。

Java端方法描述MLua的Java端方法集中在MLua中。

方法名称方法说明setBasedir(String) 设置lua 代码的最外层目录。所有lua代码都应该存放在该目录或其子目录中。 PushGlobal(String, Object) 设置全局lua 全局变量或函数。您可以推送常规对象或JavaFunctions。

后者代表lua函数的Java实现。配置数据仅在执行start方法之前生成。

使用start(String)启动Lua解析器,传递的参数代表Lua代码入口文件。 Stop() 停止Lua 解析器并释放资源。

此外,JavaFunction 也是您需要使用的接口。这代表了lua函数的Java实现。其回调方法execute(Object[])传递Lua端输入的数据,并将结果输出到Lua端。如果方法本身不需要返回任何数据,则返回null即可。

Lua侧函数描述在mLua下,原有的Lua require和print函数都被重写了。

我需要

require必须使用Java端设置的basedir作为根目录的相对路径来引用其他lua脚本。

需要“dir1/dir2/script1” 需要“script2”

支持输出一个或多个对象,但不能组合字符串和Java对象。

-- 正确的做法--print(\'hello mLua\')print(\'context: \', getContext())print(\'string \' . 111) -- 错误的做法--print(\' context: \ ' . getContext()) 以逗号分隔的对象在Java 端以制表符分隔显示。

操作Java 对象

mLua也使用反射来操作Java对象,但是mobTools的ReflectHelper具有缓存功能,理论上每次都比luajava直接反射更快。 mLua 提供以下内置函数。

函数名称函数说明import(className) 将类导入ReflectHelper 类缓存。这个函数是

细绳。在后续代码中用于从缓存中检索导入的类实例。 import(name, className) 将类导入ReflectHelper 类缓存并使用此缓存键。

构造一个具有指定名称new(className,) 的Java 实例。参数className是导入函数的返回值。

后续参数是Java 构造函数方法invokeStatic(className, methodName,) 的输入参数。此方法调用Java 静态方法invoke(receiver, methodName,) 和Java 实例方法getStatic(className, fieldName)。 )获取Java。静态字段setStatic(className, fieldName, value) 设置java 静态字段。 get(receiver, fieldName) 获取Java 实例字段。 set(receiver, fieldName, value) 设置Java 实例字段。 createProxy(proxyTable, ) 构造一个Java 接口代理。参数proxyTable是一个Lua表。

key必须与Java接口类中的方法名相同,key对应:

value是一个Lua函数,函数的参数列表和返回值也是

必须与Java接口相同。 proxyTable后面的参数是实现的接口

列表名称(所有字符串)由导入函数返回。这个函数是

Java接口代理实例。它可以传递到Java端并进行操作。

mLua在调用实例中的接口函数时会调用proxyTable。

完成功能码对应的操作

Java 边代码示例

public class MainActivity extends Activity { private MLua lua; protected void onCreate(Bundle SavedInstanceState) { super.onCreate(savedInstanceState); //构造解析器实例lua=new MLua(); //设置Lua代码的保存位置lua .setBasedir ( \'/sdcard/mLua/LuaTest\'); //推送全局对象lua.pushGlobal(\'getContext\', new JavaFunction() { public Objectexecute(Object[] args) throws Throwable { return getApplication( ); } }); try { //启动解析器,设置main.lua为入口代码lua.start(\'main\'); } catch (Throwable e) { e.printStackTrace(); } } protected void onDestroy() { //关闭解析器lua.stop(); super.onDestroy(); }}lua 端代码

-- 导入ReflectHelper.ReflectRunnable 类并将其命名为ReflectRunnable --import(\'ReflectRunnable\', \'com.mob.tools.utils.ReflectHelper$ReflectRunnable\') 本地函数main() -- 打印并演示call - - print(\'来自mLua 的hello world\') local context=getContext() print(\'当前context: \', context) local packageName=invoke(context, \'getPackageName\') print(\ 'packageName: \ ', packageName) -- Java 接口代理演示-- local luaCode={ run=function(arg) print(\'luaCode.run(), input: \', arg) return \'yoyoyo\' end } local proxy=createProxy (luaCode , \'ReflectRunnable\') local res=invoke(proxy, \'run\', packageName) print(\'luaCode.run(), Output: \', res) -- 复制数组演示-- local bArray=new( \'[B\', 16) for i=0, 15 do set(bArray, \'[\' . i . \']\', i + 1) end local bArray2=new(\ '[B \', get(bArray, \'length\')) invokeStatic(\'System\', \'arraycopy\', bArray, 0, bArray2, 0, 16) for i=0, 15 do print( \'bArray2 [\' . i . \']: \', get(bArray2, \'[\' . i . \']\')) endendmain() 扩展子mLua只能加载lua通过以下方式从文件系统中获取:虽然这是默认代码,但您可以重写MLua 的setBasedir 方法并以不同的方式实现SourceLoader,以任何您想要的方式加载Lua 代码,包括资产和加密代码。


价格汇总