安卓JAVA调用lua_android中java与lua的相互调用

Android Studio Lua环境配置

开发环境

1. Android Studio 3.5

2. java sdk: 1.8.0

3.android sdk:28

配置环境

添加lua支持语法支持插件,打开android studio -> File -> Settings

f400e4384518731f459cb3c7b5a93ff6.png

三方库选择

参考文章:https://gameinstitute.qq.com/community/detail/117865

Luaj 纯Java实现的Lua解析器,无需使用native

首先切换到Project目录,在gradle构建工具中添加依赖Luaj,然后同步

731b93f53ee701fd6123bcecb3b661a3.png

Java调用Lua函数

在main目录下新建assets资源目录文件夹,在其下存放lua文件

test.lua

luaV1 = "lua String"

function luaFun1()

print("Lua 无参无返回值方法");

end

function luaFun2(str)

return "来自Java的参数:"..str;

end

JavaTest.java

@Test

public void test1( ) {

Globals globals = JsePlatform.standardGlobals();

//加载Java脚本文件并编译Lua脚本

globals.loadfile("src/main/assets/test.lua").call();

//加载Lua常量

LuaValue luaStr = globals.get(LuaValue.valueOf("luaV1"));

System.out.println("来自Lua的字符串" + luaStr.toString());

//加载无参无返回值函数

LuaValue lua1 = globals.get(LuaValue.valueOf("luaFun1"));

lua1.call();

//加载有参有返回值函数

LuaValue lua2 = globals.get(LuaValue.valueOf("luaFun2"));

//传入参数

LuaValue str = lua2.call(LuaValue.valueOf("Java~"));

System.out.println(str.tostring());

}

运行测试方法test1输出

来自Lua的字符串lua String

Lua 无参无返回值方法

来自Java的参数:Java~

Lua调用Java

Utils.java

public void javaFun1(String str){

System.out.println("Java + " + str);

}

public static void javaStaticFun1(String str){

System.out.println("Static Java +" + str);

}

test.lua

function luaFun3()

--创建java对象

fun1 = luajava.newInstance("com.example.luaandroid.Utils");

fun1:javaFun1("Lua");

end

function luaFun4()

--绑定Java类

fun1 = luajava.bindClass("com.example.luaandroid.Utils");

fun1:javaStaticFun1("Lua");

end

JavaTest.java

@Test

public void test2(){

Globals globals = JsePlatform.standardGlobals();

//加载Java脚本文件并编译Lua脚本

globals.loadfile("src/main/assets/test.lua").call();

LuaValue lua1 = globals.get(LuaValue.valueOf("luaFun3"));

lua1.call();

}

运行测试方法test2输出:

Java + Lua

Static Java +Lua

Lua与Java运算速度对比

test.lua

function test()

a = 0;

for i = 0, 1000000, 1 do

a = a + i;

end

return "over";

end

JavaTest.java

@Test

public void test(){

long l = System.currentTimeMillis();

int a = 0;

for (int i = 0; i < 1000000; i++) {

a += i;

}

System.out.println("Java : "+ (System.currentTimeMillis() - l));

Globals globals = JsePlatform.standardGlobals();

//加载Java脚本文件并编译Lua脚本

globals.loadfile("src/main/assets/test.lua").call();

LuaValue lua1 = globals.get(LuaValue.valueOf("test"));

l = System.currentTimeMillis();

lua1.call().tostring();

System.out.println("Lua:"+ (System.currentTimeMillis() - l));

}

输出结果:

Java : 7

Lua:518

在不加Lua脚本加载的时间,多次测试,大概计算速度相差五十倍左右

LuaJava 这个没找到具体的库~~

Android-Lua GitHub地址:https://github.com/liangchenhe55/Android-Lua

引入库:

implementation group: 'com.blakequ.luajava', name: 'luajava', version: '1.0'

基本使用方法

Java调用Lua函数

MainActivity.java

//应用启动之后获取LuaState

mLuaState = LuaStateFactory.newLuaState();

mLuaState.openLibs();

//通过上下文返回lua脚本

mLuaState.LdoString(readAssetsTxt(this, "test.lua"));

//加载lua函数

mLuaState.getGlobal("luaFun1");

//传入参数

mLuaState.pushString("lua");

//第一个参数表示传入参数个数,第二个表示返回参数个数

mLuaState.call(1, 1);

//获取返回值

mLuaState.toString(-1);

test.lua

function luaFun1(str)

return str;

end

Lua中引用Java的方法

Java的方法需要是继承至JavaFunction()方法的,并重写构造函数和execute()以及register()方法

构造方法用于传入LuaState对象

execute()方法是想传入方法

register()为想生成的Lua函数取名

具体实现看后面的实例

Android中Lua应用

XMl文件配置

activity_main.xml

MyJavaFunction.java (注入Lua脚本中的方法一)

public class MyJavaFunction extends JavaFunction {

public MyJavaFunction(LuaState luaState) {

super(luaState);

}

@Override

public int execute() {

// 获取栈中Lua传入的参数,注意第一个参数固定为上下文环境。

String str = L.toString(2);

L.pushString("Java的数据 + Lua的Str:"+str);

return 1; // 返回值的个数

}

@Override

public void register(String name){

try {

// 注册为 Lua 全局函数

super.register("testJava");

} catch (Exception e) {

e.printStackTrace();

}

}

}

AsyncJavaFunction.java(注入Lua脚本中的Java方法二)

public class AsyncJavaFunction extends JavaFunction {

// lua 回调函数

// lua callback function

private LuaObject callbackFun;

public AsyncJavaFunction(LuaState L) {

super(L);

}

@Override

public int execute() {

// 获取Lua传入的参数,注意第一个参数固定为上下文环境。

if (L.isFunction(2)) {

callbackFun = L.getLuaObject(2);

new MyAsync().execute();

}

return 0;

}

void register() {

try {

// 注册为 Lua 全局函数

register("http");

} catch (LuaException e) {

e.printStackTrace();

}

}

class MyAsync extends AsyncTask{

long t;

@Override

protected void onPreExecute() {

super.onPreExecute();

t = System.currentTimeMillis();

}

@Override

protected Integer doInBackground(Integer... integers) {

try {

// 模拟耗时操作(例如网络请求)

Thread.sleep(2000);

} catch (InterruptedException e) {

e.printStackTrace();

}

return null;

}

@Override

protected void onPostExecute(Integer integer) {

super.onPostExecute(integer);

if (callbackFun != null) {

try {

// 2个参数,0 个返回值。

callbackFun.call(new Object[]{"OK", System.currentTimeMillis() - t}, 0);

} catch (LuaException e) {

e.printStackTrace();

}

}

}

}

}

test.lua

function luaFun1(str)

return testJava(str);

end

function luaCallback(tv)

-- http 函数是由 java `AsyncJavaFunction` 类注入的

-- http function was injected by java `AsyncJavaFunction`

http(function(result, time)

tv:setText(string.format("result: %s\ntime: %dms", result, time));

end

)

end

MainActivity.java (主程序文件)

public class MainActivity extends AppCompatActivity {

private TextView mTextView;

private LuaState mLuaState;

private Button mButton;

private Button mButton2;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

//绑定控件

mTextView = findViewById(R.id.textView);

mButton = findViewById(R.id.button);

mButton2 = findViewById(R.id.button2);

//应用启动之后获取LuaState

mLuaState = LuaStateFactory.newLuaState();

mLuaState.openLibs();

//通过上下文返回lua脚本

mLuaState.LdoString(readAssetsTxt(this, "test.lua"));

mButton.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

//利用Java函数生成lua函数,设置函数名为testJava

new MyJavaFunction(mLuaState).register("testJava");

//加载lua函数

mLuaState.getGlobal("luaFun1");

//传入参数

mLuaState.pushString("test");

//第一个参数表示传入参数个数,第二个表示返回参数个数

mLuaState.call(1, 1);

mTextView.setText(mLuaState.toString(-1));

}

});

mButton2.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

mTextView.setText("Loading...");

new AsyncJavaFunction(mLuaState).register();

mLuaState.getGlobal("luaCallback");

mLuaState.pushJavaObject(mTextView);

mLuaState.call(1, 0);

}

});

}

public static String readAssetsTxt(Context context, String fileName) {

try {

InputStream is = context.getAssets().open(fileName);

int size = is.available();

byte[] buffer = new byte[size];

is.read(buffer);

is.close();

String text = new String(buffer, "utf-8");

return text;

} catch (IOException e) {

e.printStackTrace();

}

return "err";

}

@Override

protected void onDestroy() {

//关闭lua栈

mLuaState.close();

super.onDestroy();

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/411524.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

过年之-防飞车贼

1、飞车贼最喜欢在马路边和小巷子里下手。 2、当你在偏僻路段单独行走时&#xff0c;听到后面有靠近的车声&#xff0c;提高警惕&#xff0c;注意避让尾随跟踪、企图接近的摩托车。 3、对于可疑车辆、人员要提高警惕&#xff0c;特别是两个人的摩托车&#xff1a;飞车贼寻找目标…

[html]如何让元素固定在页面底部?有哪些比较好的实践?

[html]如何让元素固定在页面底部&#xff1f;有哪些比较好的实践&#xff1f; *{margin:0;padding:0; } body{height:2000px; } div{width:100%;height:30px;position: fixed;bottom:0;text-align:center;line-height:30px;background: #00CCCC; }个人简介 我是歌谣&#xff…

Windows 2008 R2阿里云安全基线检查

设置密码使用期限策略在管理工具打开本地安全策略&#xff0c;打开路径:安全设置\帐户策略\密码策略&#xff0c;将密码最长使用期限设置为30-180之间&#xff0c;建议值为90&#xff0c;将密码最短使用期限设置为1-14之间&#xff0c;建议值为7.风险账户检查存在可疑隐藏账号&…

用ajax(vb.net) 实现dropdownlist二级无刷新联动~!

说说vb.net ajaxpro 实现dropdownlist二级无刷新联动~&#xff01;Code<div class"div_RSL"> <asp:DropDownList ID"DropDownList1" runat"server" DataSourceID"proID" DataTextField"proName"AutoPostBack"…

[html] xml与html有什么区别?

[html] xml与html有什么区别&#xff1f; xml, 是必须有结束元素<br></br>, 它们是自定义 html, 允许单必合<br />, 它们是已经定义好的 好像头部声明不一样? 其它不记得了, 说实话, 没怎么用过xml个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端…

JAVA遍历文件中的字符串_Java遍历文件夹下所有文件并替换指定字符串

应用场景&#xff1a;比如有一个深层次的文件目录结构&#xff0c;如&#xff1a;javaAPI每个文件里面都有相同的内容&#xff0c;而我们要统一修改为其他内容。上千个文件如果一个个修改显得太不明智。import java.io.BufferedReader;import java.io.File;import java.io.File…

python -m pip install [package] --no-deps

python -m pip install [package] --no-deps 有些 packages 会依赖一些其它的 package&#xff0c;当我们离线安装 whl 的时候&#xff0c;就无法联网下载依赖包&#xff0c;所以我们需要 --no-deps 来去掉依赖包的安装&#xff0c;这样就能离线安装 whl 了 但是 如果 whl 有…

SQLserver被js注入的全库替换SQL

CodeDECLARE fieldtype sysnameSET fieldtypenvarchar--替换处理DECLARE hCForEach CURSOR GLOBALFOR--要替换的列的数据类型SELECT NUPDATE QUOTENAME(o.name)N set QUOTENAME(c.name)REPLACE(QUOTENAME(c.name),<script srchttp://cn.daxia123.cn/cn.js></script>…

[html] 页面中怎么嵌入Flash?有哪些方法?写出来

[html] 页面中怎么嵌入Flash&#xff1f;有哪些方法&#xff1f;写出来 <object width"550" height"400"><param name"movie" value"somefilename.swf"><embed src"somefilename.swf" width"550"…

蓝桥杯java能用编译器1吗_学java的你,这些英文单词都掌握了吗?

1、Abstract class 抽象类:抽象类是不允许实例化的类&#xff0c;因此一般它需要被进行扩展继承。2、Abstract method 抽象方法:抽象方法即不包含任何功能代码的方法。3、Anonymous class 匿名类:当你需要创建和使用一个类&#xff0c;而又不需要给出它的名字或者再次使用的使用…

《高性能网站建设指南》勘误

《高性能网站建设指南》勘误 P5&#xff08;第1章&#xff09;倒数第1段倒数第3行原文&#xff1a;如果你遵从所有适用于你的网站的规则&#xff0c;你的页面的加载速度会提高20%~25%&#xff0c;用户体验也将得到改善。修改&#xff1a;如果你遵从所有适用于你的网站的规则&am…

[html] HTML5如何使用音频和视频?

[html] HTML5如何使用音频和视频&#xff1f; video和audio标签个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

bit不是java基本类型吗_Java bit / byte 基本数据类型

1. bit&#xff1a;位 一个二进制数据0或1&#xff0c;是1bit&#xff1b; 2. byte&#xff1a;字节 存储空间的基本计量单位&#xff0c;如&#xff1a;MySQL中定义 VARCHAR(45) 即是指 45个字节&#xff1b; 1 byte 8 bit 3. 一个英文字符占一个字节&#xff1…

Delphi 与 DirectX 之 DelphiX(35): TDIB.Saturation();

本例效果图:代码文件:unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, DIB, StdCtrls;typeTForm1 class(TForm)DXPaintBox1: TDXPaintBox;Button1: TButton;Button2: TButton;procedure Button1Click(Sender: T…

RabbitMQ基本概念(三)-Centos7下安装RabbitMQ3.6.1

如果你看过前两章对RabbitMQ已经有了一定了解&#xff0c;现在已经摩拳擦掌&#xff0c;来吧动手吧&#xff01; 用什么系统 本文使用的是Centos7&#xff0c;为了保证对linux不太熟悉的伙伴也能轻松上手&#xff08;避免折在安装的路上&#xff09;&#xff0c;下面是我的系统…

[html] 说说你对WEB标准和W3C的理解与认识?

[html] 说说你对WEB标准和W3C的理解与认识&#xff1f; 网页主要由三个部分组成&#xff0c;表现、结构和行为。我理解的就是&#xff1a;html是名词--表现 css是形容词--结构 javascript是动词--行为 以上这三个东西就形成了一个完整的网页&#xff0c;但是js改变时&#xff…

pom添加mysql依赖tomcat崩溃_Spring Boot + Mybatis + Spring MVC环境配置(一) :Spring Boot初始化,依赖添加...

最近在搭建一个Spring Boot Mybatis Spring MVC的环境&#xff0c;折腾来折腾去&#xff0c;两三天才搞定&#xff0c;记录下大概过程和遇到的错误看一下Spring Boot官方的介绍&#xff1a;Spring Boot让开发者省去了大多数Spring的配置&#xff0c;让其只需要关注主要的开发…

串行线路上传输数据报的非标准协议:SLIP

简介TCP/IP协议族可以在许多网络介质上运行&#xff0c;如&#xff1a; IEEE 802.3 &#xff08;以太网&#xff09;和802.5&#xff08;令牌环&#xff09;局域网&#xff0c;X.25线路&#xff0c;卫星连接和串行线路。除了串行线路外&#xff0c;其它的介质上都有包格式的标准…

【SR汇总】基于深度学习方法

1、SRCNN、FSRCNN (Learning a Deep Convolutional Network for Image Super-Resolution, ECCV2014) (Accelerating the Super-Resolution Convolutional Neural Network, ECCV2016) 2、ESPCN、VESPCN (Real-Time Single Image and Video Super-Resolution Using an Efficient …

[html] 说说你对target=“_blank“的理解?有啥安全性问题?如何防范?

[html] 说说你对target"_blank"的理解&#xff1f;有啥安全性问题&#xff1f;如何防范&#xff1f; 在新的空白页, 打开该链接, 安全性问题, 就是, 如果url中带有敏感信息, 会被第三方网站读取到document.referer个人简介 我是歌谣&#xff0c;欢迎和大家一起交流…