AndroidでJavaからPythonを呼び出してみる

Androidでは、Adnrdoid-scriptingを使ってPythonを実行できる環境をインストールできます。

サイトから.apkをダウンロードし、

% adb install ase_r25.apk

してインストールします。(Androidの設定で アプリケーション -> 提供元不明のアプリ のチェックをオンにしておく必要があります。)

最初はborne shellしかありませんが、Menuから View -> Interpreters をタップし、もう一度Menuを出して、Addを選択することでPythonなど他の言語をインストールできます。

Javaから呼び出してみる

さて、ここからが本番。JavaではProcessBuilderを使って外部プロセスを呼び出すことができます。

import sys

print sys.path

というファイルをtest.pyという名前で作成し、SDカードに送り込みます。

% adb push test.py  /sdcard/ase/scripts/

この準備をした上で、以下のようなコードを書きます。

String TAG = "PB"; // 任意
ProcessBuilder pb = new ProcessBuilder(
        "/data/data/com.google.ase/python/bin/python",
        "/sdcard/ase/scripts/test.py"
        );

try{
    Process p = pb.start();
    int ret = p.waitFor();
    Log.d(TAG, "invoke finished with return: " + ret);

    String line = null;
    StringBuffer retOut = new StringBuffer();

    BufferedReader reader = new BufferedReader(
                            new InputStreamReader(p.getInputStream()));
    while ((line = reader.readLine()) != null) {
        retOut.append(line + "\n");
    }

    Log.d(TAG, retOut.toString());

    reader.close();
}catch (IOException e){
    Log.e(TAG, "Error occured in invoking process.");
}catch (InterruptedException e){
    Log.e(TAG, "Error occured in waiting process.");
}

このコードを実行して、adb logcat してみると、

D/PB      ( 2738): Could not find platform independent libraries<prefix>
D/PB      ( 2738): Consider setting $PYTHONHOME to<prefix>[:<exec_prefix>]
D/PB      ( 2738): 'import site' failed; use -v for traceback
D/PB      ( 2738): ['/mnt/sdcard/ase/scripts',
'/data/data/com.google.ase/python/lib/python26.zip',
'/data/data/com.google.ase/python/lib/python2.6/',
'/data/data/com.google.ase/python/lib/python2.6/plat-linux2',
'/data/data/com.google.ase/python/lib/python2.6/lib-tk',
'/data/data/com.google.ase/python/lib/python2.6/lib-old', '/data/data/com.google.ase/python/lib/python2.6/lib-dynload']

とちゃんとpathが出力されていることが分かります。

このように、外部プロセス呼び出しを使うことで、JavaからPythonを呼び出し、返り値を得ることが出来ます。
これを利用することで、UIをJavaで作りそこから既存のPythonスクリプトを使ったり、ネットワーク上からScriptを持ってきて動的に機能を拡張させたりと、いろいろなことができます。

たぶん。