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を持ってきて動的に機能を拡張させたりと、いろいろなことができます。
たぶん。