热更新-Android与Lua相互通信
来源:互联网 发布:网站在线seo免费外链 编辑:程序博客网 时间:2024/05/17 04:58
热更新介绍
- 什么是热更新?
客户端启动时,主动请求服务端检查版本号,并更新资源到本地。
- 应用场景:
- 情况一:客户端已经发布了,但突然发现有个比较严重的bug需要修复。这时需要更新客户端的代码(Lua代码)。
- 情况二:情人节到了,需要搞个活动,在客户端中营造一个节日氛围。这时,需要更新客户端资源或增加一些功能。
- 好处:
不需要重新打包和提交应用到市场等待审核。
Android与Lua相互通信
参考资料:
- Lua 5.1 在线参考手册
- 开源项目LuaJava
1. 在Android项目中使用Lua,需要两个步骤:
- 加载Lua脚本解析引擎
- 以Native API方式调用引擎接口
直接以JNI方式调用Lua解析引擎的接口十分麻烦,开源项目LuaJava(https://github.com/mkottman/AndroLua )对这些JNI接口进行了很好的封装,它是一个包含了LuaJava的Android平台的Lua解析器,它提供一系列映射到Lua C实现函数的Java接口。
2. 需注意的地方:
- .lua文件可存放在assets、raw文件夹;
- 提供给lua的回调必须是public,否则lua调不到;
- “.”是用来调用类的方法或变量(静态方法),而“:”是用来调用对象的方法。
3. 在Lua中调用Java类:
- newInstance(className, …) // 可以根据类名创建一个Java类,同时返回一个lua变量与Java类对应
-- 启动手机设置function launchSetting(context) -- 得到Intent类的实例 intent = luajava.newInstance("android.content.Intent") c = luajava.newInstance("android.content.ComponentName","com.android.settings", "com.android.settings.Settings") -- intent:用来调用对象的方法 -- intent.用来调用类的方法或变量(静态方法) intent:setFlags(intent.FLAG_ACTIVITY_NEW_TASK); intent:setComponent(c) context:startActivity(intent)end
- bindClass(className) // 可以让lua中的变量对应一个Java的类(是类,不是实例),这样就可以用lua的这个变量创建实例以及调用静态类
require 'import'button_cb = {}function button_cb.onClick(ev) print('hello,world') launchSetting(activity)end--[=[ 因为id是R.java里的一个静态类,所以引用Button的资源文件用下面的代码: id.launchButton,而不是id:launchButton ]=]local id = luajava.bindClass("sk.kottman.androlua.R$id")local launch = activity:findViewById(id.launchButton)-- 另外,注意类中类的引用方法,如:android.view.View$OnClickListenerbuttonProxy = luajava.createProxy("android.view.View$OnClickListener", button_cb)launch:setOnClickListener(buttonProxy)
4. 在java中调用Lua:
- LuaState mLuaState = LuaStateFactory.newLuaState(); // Lua解析和执行由此对象完成
- mLuaState.openLibs();
- 调用Lua脚本语句:
private void executeLuaStatemanet() { mLuaState.LdoString(" varSay = 'call from android : This is string in lua script statement.'");// 定义一个Lua变量 mLuaState.getGlobal("varSay");// 获取 displayResult1.setText(mLuaState.toString(-1));// 输出}
4.调用Lua脚本文件:
private void executeLuaFile() { mLuaState.LdoString(readStream(getResources().openRawResource(R.raw.luafile))); mLuaState.getField(LuaState.LUA_GLOBALSINDEX, "functionInLuaFile");// 找到functionInLuaFile函数 mLuaState.pushString("从Java中传递的参数");// 将参数压入栈 // functionInLuaFile函数有一个参数,一个返回结果 int paramCount = 1; int resultCount = 1; mLuaState.call(paramCount, resultCount); mLuaState.setField(LuaState.LUA_GLOBALSINDEX, "resultKey");// 将结果保存到resultKey中 mLuaState.getGlobal("resultKey");// 获取 displayResult2.setText(mLuaState.toString(-1));// 输出}
5.调用android API:
private void callAndroidAPI() { mLuaState.LdoString(readStream(getResources().openRawResource(R.raw.luafile))); mLuaState.getField(LuaState.LUA_GLOBALSINDEX, "callAndroidApi");// 找到callAndroidApi函数 mLuaState.pushJavaObject(getApplicationContext()); // 上下文 mLuaState.pushJavaObject(mLayout); // 布局 mLuaState.pushString("lua call android Textview的setText()方法, 内容是:" + (++count)); // 内容 mLuaState.call(3, 0); // callAndroidApi函数需要传递3个参数,0个返回值}
6.raw文件目录下luafile.lua代码:
-- 调用Lua脚本文件function functionInLuaFile(key) return 'call from android: I am in Lua file . Return : '..key..'!'end-- 调用android APIfunction callAndroidApi(context,layout,tip) tv = luajava.newInstance("android.widget.TextView",context) tv:setText(tip) layout:addView(tv)end
0 0
- 热更新-Android与Lua相互通信
- 热更新-Android与Lua相互通信
- 热更新--android与lua相互通信++++++++what
- Unity3D热更新基础:C#与Lua相互调用
- Unity3D热更新基础:C#与Lua相互调用
- 热更新中的lua与c#
- 菜鸟学习 - Unity中的热更新 - Lua和C#通信
- 初学者学习 - Unity中的热更新 - Lua和C#通信
- 初学者学习 - Unity中的热更新 - Lua和C#通信
- Unity中的热更新 - Lua和C#通信
- lua代码热更新
- lua 热更新
- lua 热更新
- lua 热更新
- lua 热更新
- cocos2dx lua 热更新
- lua 热更新
- 热更新lua语法
- iOS9问题备忘
- Mustache和jq处理form表单的提交与绑定
- java函数参数是按值传递的
- Cent OS相关问题汇总(持续更新)
- iOS Provisioning Profile(Certificate)与Code Signing详解(转)
- 热更新-Android与Lua相互通信
- linux之ps命令详解
- Spring事务配置的五种方式
- socket编程——sockaddr_in结构体操作
- 远程连接Ubuntu9 服务器 (putty)ssh 连接
- dcm文件编程
- 机器学习领域的几种主要学习方式
- LDO基础知识
- 平时笔记,留待以后查询