Android で Luaスクリプト実行

アプリ開発
スポンサーリンク

環境

  • 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 が実行されます。

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 から呼ばれるクラスを作成します。

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

次のように修正します。

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がトーストを使う
タイトルとURLをコピーしました