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