安卓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
三方库选择
参考文章: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的相互调用相关推荐
- linux c程序调用脚本,C程序与Lua脚本相互调用
Lua脚本是一种可用于C程序开发/测试的工具,本篇介绍一下C程序与Lua脚本如何进行相互调用,更加详细的操作参见<Programing in Lua>.本文分为3个部分:1.Windows ...
- android 调用java类_Android中在WebView里实现Javascript调用Java类的方法
搜索热词 为了方便网页和Android应用的交互,Android系统提供了WebView中JavaScript网页脚本调用Java类方法的机制.只要调用addJavascriptInterface方法 ...
- webview 调用java_Android中在WebView里实现Javascript调用Java类的方法
为了方便网页和Android应用的交互,Android系统提供了WebView中JavaScript网页脚本调用Java类方法的机制.只要调用addJavascriptInterface方法即可映射一 ...
- vscode java环境_VSCode中Java开发环境的配置方法
vscode中怎么搭建Java开发环境?下面本篇文章给大家介绍一下VSCode配置Java开发环境的方法.有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助. 配置Java开发环境 主要参 ...
- acm java输入输出_ACM中java如何快速输入输出
今天又遇到java做ACM超时的问题. 然后网上找了好多方法,最后总结出自己的. java的Scanner 比较慢(出了名的了),但是ACM的要求有比较高. java其实有别的解决方案,就是使用Str ...
- Lua学习笔记6:C++和Lua的相互调用
曾经一直用C++写代码.话说近期刚换工作.项目组中的是cocos2dx-lua,各种被虐的非常慘啊有木有. 新建cocos2dx-lua项目.打开class能够发现,事实上就是C++项目啦,只是为什么 ...
- python什么是调用_Python中包(package)的调用方式
一.什么是Python Package 如何区分你看到的目录是一个Python Package包呢?其实很简单,你只要看这个名录下是否有"__init__.py"这个文件就好了,如 ...
- pycharm中两个.py文件相互调用和传递参数
在编写比较大的程序或团队协同工作时,常常会用到两个.py程序之间的相互调用和传递参数,我把自己理解的一个方法写一下. 首先要求pycharm已经安装了sys库,已知sys.argv是传递参数的核心. ...
- android调用js函数方法,Android和JavaScript相互调用的方法
本文实例讲述了Android和JavaScript相互调用的方法.分享给大家供大家参考,具体如下: Html页面和Java代码结合的方式一般用在界面经常被更改 的情况下,可以讲html放在网络中,软件 ...
最新文章
- 送你一份 Nginx 最佳入门手册
- 如何入手卷积神经网络
- 将数组按指定大小分组
- Vue.js的基本使用 学习笔记
- Entity Framework 实体框架的形成之旅--为基础类库接口增加单元测试,对基类接口进行正确性校验(10)...
- Kotlin之?和!!最简单的理解
- Taro+react开发(75):taro简介
- android xml图片圆角矩形,使用Path自定义圆角图片
- java 线程 john_教你Java开发中多线程同步技巧
- python dict遍历性能_python 字典(dict)遍历的四种方法性能测试报告
- Android App自动更新解决方案(DownloadManager)
- 用粉红噪声煲机_白噪音|煲机白噪音粉红噪音mp3下载 - 121下载站
- 两列数据对比找不同,并且高亮数据不同的单元格
- 基于auto.js的微信朋友圈自动点赞脚本
- VUE不同路由地址跳转相同页面,页面数据根据不同参数刷新
- Linux进程间通信(二)之信号量
- 一辆智能小车,最初(时间为0)的位置为(0,0),我们想知道它最后的位置。小车以每小时10公里的速度向北移动(以北为y轴正向,以东为x轴正向)。小车会受到一系列依照时间戳记排序的命令,1表示“向左转”
- linux下查看显卡和驱动版本
- PCI与PCIe学习一——硬件篇
- ot permission denied while trying to connect to the Docker daemon socket at
热门文章
- Taro+react开发(32)注意符号
- [html] 写一个三栏布局,两边固定,中间自适应
- [css] 请使用css写一个多级的下拉菜单
- 工作320:uni-预加载问题
- 前端学习(2785):实现导航的基本结构
- 前端学习(2335):angular之内置结构指令ngif
- 前端学习(1992)vue之电商管理系统电商系统之实现搜索和清空
- 前端学习(1184):数据绑定指令
- 前端学习(871):attachment注册事件
- mybatis学习(14):log4j:ERROR Category option 1 not a decimal integer.