安卓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,一经查实,立即删除!

相关文章

用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"…

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>…

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

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

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;下面是我的系统…

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;让其只需要关注主要的开发…

Jmeter脚本增强之参数化(多方式实现)(6)

参数化的场景&#xff1a; ①在插入记录时&#xff0c;数据库对某些字段唯一限制&#xff0c;这时需要参数化&#xff08;不能传固定参数&#xff09; ②在压测过程中&#xff0c;需要使用不同的用户登录&#xff0c;模拟真实的使用场景&#xff08;避免数据库查询缓存&#xf…

docker学习二

一 部署Mysql 搜索镜像 docker search mysql拉取镜像 docker pull centos/mysql-57-centos7 创建Mysql 容器 docker run -di --namedocker_mysql -p 33306:3306 -e MYSQL_ROOT_PASSWORDroot centos/mysql-57-centos733306是宿主机的端口&#xff0c;3306是docker的端口&#xf…

new关键字对类成员的阻断

昨天终于对new关键字对类成员的阻断作用有了比较清晰的认识&#xff0c;“对类成员的阻断”是王涛大哥在其作品《你必须知道的.NET》的说法&#xff0c;昨天在园里看到一位前辈戏称之为“封印咒术”&#xff0c;我感觉这个说法很贴切。比如Sons类继承自Fathers类&#xff0c;在…

LOJ 2979 「THUSCH 2017」换桌——多路增广费用流

题目&#xff1a;https://loj.ac/problem/2979 原来的思路&#xff1a; 优化连边。一看就是同一个桌子相邻座位之间连边、相邻桌子对应座位之间连边。 每个座位向它所属的桌子连边。然后每个人建一个点&#xff0c;向若干桌子连边。 因为连边的桌子是区间&#xff0c;所以线段树…

java如何实现红包雨,一个简单的红包雨实现

效果图如下&#xff1a;我的视频 1_20170207191503.gif这个简单动画的主要思路&#xff1a; 将多个 红包View 通过 属性动画 从屏幕顶端 飘落到 屏幕底部。只不过在飘落的动画过程中&#xff0c;加入了一些随机路线 Path。主要涉及到的知识点&#xff1a;1.Path 和 PathMeasure…

【原】基于Windows Media Player, 写自己的播放器【有源码,可下载整个工程】

最近有客户问我&#xff0c;怎么把Windows Media Player 嵌套在自己的项目中。 以前我在Delphi下玩过Windows Media Player&#xff0c;可是在Microsoft Visual Studio 2008 没有测试过。 到网上搜索了一把&#xff0c;果然得到很多例子。 其中CSDN上有个例子写的不错&#xff…

Oracle数据库php短连接,PHP 连接 Oracle

起因由于项目的数据库需要用客户购买的Oracle数据库&#xff0c;所以需要php安装oci扩展。运行环境php : 7.2系统: windows10oracle: 11gR2安装相关环境由于php的oci8扩展还是需要使用到oracle的一些包&#xff0c;所以先下载这一些。下载完成后解压缩这个压缩包&#xff0c;并…

计算机考研文章精选[转载]

今天在网上看到了一篇超全的计算机考研文章集合&#xff0c;里面有很多曾经看过&#xff0c;挺经典的&#xff0c;于是忍不住收藏下来&#xff0c;希望对那些即将报考计算机研究生和工作了仍不放弃考研的朋友有所帮助 计算机考研常见问题解答 地址&#xff1a;http://ww…

PHP鼠标滑过变色命令,WordPress鼠标悬停变色的修改方法

原创内容&#xff0c;转载请注明出处&#xff1a;https://www.myzhenai.com.cn/post/3253.html关键词&#xff1a;wordpress 鼠标 悬停 变色我总是觉得我两个WordPress博客的主题里使用的鼠标悬停变色的颜色不太喜欢&#xff0c;就是当鼠标划过或停留在某一个链接上的时候&…

圆面积异常

package zengliang;import java.util.*;public class Suv {public static void main(String[] args) {// TODO 自动生成的方法存根try{double r,s;final double PI 3.14;Scanner scnew Scanner(System.in);System.out.println("输入圆的半径&#xff1a;");r sc.ne…

SpringBoot学习笔记(9)----SpringBoot中使用关系型数据库以及事务处理

在实际的运用开发中&#xff0c;跟数据库之间的交互是必不可少的&#xff0c;SpringBoot也提供了两种跟数据库交互的方式。 1. 使用JdbcTemplate 在SpringBoot中提供了JdbcTemplate模板类&#xff0c;JdbcTemplate提供的方法进行增删改查的操作。 首先需要在pom文件中添加依赖:…

Processes

转载于:https://www.cnblogs.com/EMH899/p/10844709.html

[html] 说说video标签中预加载视频用到的属性是什么?

[html] 说说video标签中预加载视频用到的属性是什么&#xff1f; 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

CodeSmith 5.0工具实例篇系列4——根据表生成修改的存储过程,针对MS Sqlserver

运行该模板时&#xff0c;只需要选择单个表即可。 申明&#xff1a;该系列案例已通过CodeSmith Professional 5.0.1 Revision 4983版本的测试&#xff0c;以及生成的存储过程是针对MS Sqlserver。 操作说明 &#xff1a;运行CodeSmith Studio工具 &#xff0c;创建Blank Templa…