Android Studio Lua环境配置

开发环境

1. Android Studio 3.5

2. java sdk: 1.8.0

3.android sdk:28

配置环境

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

三方库选择

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

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

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

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();

}

}

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

  1. linux c程序调用脚本,C程序与Lua脚本相互调用

    Lua脚本是一种可用于C程序开发/测试的工具,本篇介绍一下C程序与Lua脚本如何进行相互调用,更加详细的操作参见<Programing in Lua>.本文分为3个部分:1.Windows ...

  2. android 调用java类_Android中在WebView里实现Javascript调用Java类的方法

    搜索热词 为了方便网页和Android应用的交互,Android系统提供了WebView中JavaScript网页脚本调用Java类方法的机制.只要调用addJavascriptInterface方法 ...

  3. webview 调用java_Android中在WebView里实现Javascript调用Java类的方法

    为了方便网页和Android应用的交互,Android系统提供了WebView中JavaScript网页脚本调用Java类方法的机制.只要调用addJavascriptInterface方法即可映射一 ...

  4. vscode java环境_VSCode中Java开发环境的配置方法

    vscode中怎么搭建Java开发环境?下面本篇文章给大家介绍一下VSCode配置Java开发环境的方法.有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助. 配置Java开发环境 主要参 ...

  5. acm java输入输出_ACM中java如何快速输入输出

    今天又遇到java做ACM超时的问题. 然后网上找了好多方法,最后总结出自己的. java的Scanner 比较慢(出了名的了),但是ACM的要求有比较高. java其实有别的解决方案,就是使用Str ...

  6. Lua学习笔记6:C++和Lua的相互调用

    曾经一直用C++写代码.话说近期刚换工作.项目组中的是cocos2dx-lua,各种被虐的非常慘啊有木有. 新建cocos2dx-lua项目.打开class能够发现,事实上就是C++项目啦,只是为什么 ...

  7. python什么是调用_Python中包(package)的调用方式

    一.什么是Python Package 如何区分你看到的目录是一个Python Package包呢?其实很简单,你只要看这个名录下是否有"__init__.py"这个文件就好了,如 ...

  8. pycharm中两个.py文件相互调用和传递参数

    在编写比较大的程序或团队协同工作时,常常会用到两个.py程序之间的相互调用和传递参数,我把自己理解的一个方法写一下. 首先要求pycharm已经安装了sys库,已知sys.argv是传递参数的核心. ...

  9. android调用js函数方法,Android和JavaScript相互调用的方法

    本文实例讲述了Android和JavaScript相互调用的方法.分享给大家供大家参考,具体如下: Html页面和Java代码结合的方式一般用在界面经常被更改 的情况下,可以讲html放在网络中,软件 ...

最新文章

  1. 送你一份 Nginx 最佳入门手册
  2. 如何入手卷积神经网络
  3. 将数组按指定大小分组
  4. Vue.js的基本使用 学习笔记
  5. Entity Framework 实体框架的形成之旅--为基础类库接口增加单元测试,对基类接口进行正确性校验(10)...
  6. Kotlin之?和!!最简单的理解
  7. Taro+react开发(75):taro简介
  8. android xml图片圆角矩形,使用Path自定义圆角图片
  9. java 线程 john_教你Java开发中多线程同步技巧
  10. python dict遍历性能_python 字典(dict)遍历的四种方法性能测试报告
  11. Android App自动更新解决方案(DownloadManager)
  12. 用粉红噪声煲机_白噪音|煲机白噪音粉红噪音mp3下载 - 121下载站
  13. 两列数据对比找不同,并且高亮数据不同的单元格
  14. 基于auto.js的微信朋友圈自动点赞脚本
  15. VUE不同路由地址跳转相同页面,页面数据根据不同参数刷新
  16. Linux进程间通信(二)之信号量
  17. 一辆智能小车,最初(时间为0)的位置为(0,0),我们想知道它最后的位置。小车以每小时10公里的速度向北移动(以北为y轴正向,以东为x轴正向)。小车会受到一系列依照时间戳记排序的命令,1表示“向左转”
  18. linux下查看显卡和驱动版本
  19. PCI与PCIe学习一——硬件篇
  20. ot permission denied while trying to connect to the Docker daemon socket at

热门文章

  1. Taro+react开发(32)注意符号
  2. [html] 写一个三栏布局,两边固定,中间自适应
  3. [css] 请使用css写一个多级的下拉菜单
  4. 工作320:uni-预加载问题
  5. 前端学习(2785):实现导航的基本结构
  6. 前端学习(2335):angular之内置结构指令ngif
  7. 前端学习(1992)vue之电商管理系统电商系统之实现搜索和清空
  8. 前端学习(1184):数据绑定指令
  9. 前端学习(871):attachment注册事件
  10. mybatis学习(14):log4j:ERROR Category option 1 not a decimal integer.