Android で Luaスクリプト実行

Uncategorized
418 words

環境

  • Windows 11 Home 21H2 22000.613
  • Android Studio Bumblebee | 2021.1.1 Patch 1
  • API 26: Android 8.0 (Oreo)
  • luaj-3.0.1

準備

Android

Empty Activity で新規プロジェクトを作成しておきます。

新規プロジェクト作成

新規プロジェクト作成

Lua

次のページ から「luaj-3.0.1.zip」をダウンロードして展開しておきます。

「luaj-3.0.1.zip」ダウンロード

展開

手順

AndroidプロジェクトにLuaを導入

展開した luaj-3.0.1フォルダーの「lib」フォルダー内に「luaj-jse-3.0.1.jar」があるので、これを Androidプロジェクト の「app > libs」フォルダーにコピペします。

luaj-jse-3.0.1.jar コピー

フォルダーにコピペすると、Android Studio の方に Luajライブラリ が表示されます。

libs

そのまま「luaj-jse-3.0.1.jar」を右クリックし「Add As Library」を選択し、Lua を導入します。

Add As Library

Android から Lua実行

MainActivity

次のコードをコピペしてアプリを実行すると Lua が実行されます。

1
2
3
4
5
6
7
8
9
10
11
12
13
public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

String myScript = "print(\"Hello Lua !!\")";
Globals globals = JsePlatform.standardGlobals();
LuaValue chunk = globals.load(myScript);
chunk.call();
}
}

Android から Lua実行

実行

アプリを実行すると Lua がログを出力します。

ログ出力

Lua から Androidのメソッド実行

MyLua2Java

Lua から呼ばれるクラスを作成します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class MyLua2Java extends LibFunction {
private Context _context = null;

public MyLua2Java(Context context) {
_context = context;
}

public LuaValue call(LuaValue modname, LuaValue env) {
LuaValue library = tableOf();
library.set("toast", new toast());
env.set("MyLua2Java", library);
return library;
}

class toast extends OneArgFunction {
public LuaValue call(LuaValue x) {
Toast.makeText(_context , x.toString(), Toast.LENGTH_LONG).show();
return null;
}
}
}

Lua から Androidのメソッド実行

MainActivity

次のように修正します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

String myScript = "MyLua2Java.toast(\"Hello Lua !!\")";
Globals globals = JsePlatform.standardGlobals();
globals.load(new MyLua2Java(this));
LuaValue chunk = globals.load(myScript);
chunk.call();
}
}

Lua から Androidのメソッド実行

実行

アプリを実行すると Lua が Javaに作ったトーストを使います。

Luaがトーストを使う