热更新--android与lua相互通信++++++++what

1111111111111111android与lua相互通信

--在android项目中使用lua,需要两个步骤

--加载lua脚本解析引擎

--以native API方式调用引擎接口

直接以JNI方式调用lua解析引擎的接口十分麻烦

开源项目LuaJava(https://github.com/mkottman/AndroLua)对这些JNI接口进行了很好的封装

它是一个包含了LuaJava的Android平台的Lua解析器,它提供一系列映射到Lua C实现函数的java接口

2222222222222需要注意的地方

Lua文件可存放在assets,raw文件夹

提供给lua的回调必须是public,否则lua调不到

”         .           “是用来调用类的方法或变量(静态方法)

而“        :      ”是用来调用对象的方法

33333333333333在lua中调用java类

aaaaaaaaaaaaaa: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

Bbbbbbbbbbbbbb: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$OnClickListener

buttonProxy = luajava.createProxy("android.view.View$OnClickListener", button_cb)

launch:setOnClickListener(buttonProxy)

44444444444444,在 java中调用lua

aaaaaaaaaaa,LuaState mLuaState= LuaStateFactory.newLuaState();

Bbbbbbbbbbb,mLuaState.openLibs();

ccccccccccc,调用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));// 输出

}

Dddddddddddddddd,调用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));// 输出

}

Eeeeeeeeeeeeeeeeeeeeeeeeee,调用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 API

function callAndroidApi(context,layout,tip)  

tv = luajava.newInstance("android.widget.TextView",context)  

tv:setText(tip)  

layout:addView(tv)

end

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值