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

本文介绍了如何在Android环境中配置和使用Lua,包括Java调用Lua函数和Lua调用Java方法的详细步骤。通过示例代码展示了如何使用Luaj库进行交互,并探讨了Lua与Java的运算速度差异。此外,还提到了Android-Lua库的使用和注入Java方法到Lua脚本的方法。
摘要由CSDN通过智能技术生成

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

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值