AndroidでPythonを入れる方法
なんか簡単そうだったのでメモ
まず、こっからSL4Aのソースをダウンロードしてくる
http://code.google.com/p/android-scripting/
ソースはGiHubかな
https://github.com/damonkohler/sl4a
んで、ここのandroid/script_for_android_template.zipを使う
これかな
https://github.com/damonkohler/sl4a/blob/master/android/script_for_android_template.zip
まぁそんだけなんだけど、サービスとかごちゃごちゃ使ってて分かりにくいので
組み込み用に抜粋した
まずlibs/script.jarを自分のプロジェクトにコピーして、Eclipseでビルドパスに追加
組み込んだアプリにPythonがなかったらダウンロードさせるところ抜粋
public InterpreterConfiguration conf_; conf_ = new InterpreterConfiguration(this); conf_.startDiscovering(); scriptInstall("py", "python"); public void scriptInstall(String ext, String packageName) { Interpreter script = conf_.getInterpreterForScript("." + ext); if((script == null || !script.isInstalled()) && FeaturedInterpreters.isSupported("." + ext)) { String interpreter = FeaturedInterpreters.getInterpreterNameForScript("." + ext); if (interpreter == null) { Log.e("scriptInstall", "Cannot find interpreter for script ." + ext); return; } Intent activityIntent = new Intent(); Intent resolveIntent = new Intent(InterpreterConstants.ACTION_DISCOVER_INTERPRETERS); resolveIntent.addCategory(Intent.CATEGORY_LAUNCHER); resolveIntent.setType(InterpreterConstants.MIME + ext); List<ResolveInfo> resolveInfos = getPackageManager().queryIntentActivities(resolveIntent, 0); if (resolveInfos != null && resolveInfos.size() == 1) { ActivityInfo info = resolveInfos.get(0).activityInfo; activityIntent.setComponent(new ComponentName(info.packageName, info.name)); activityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); } else { URL url = FeaturedInterpreters.getUrlForName(interpreter); activityIntent.setAction(Intent.ACTION_VIEW); activityIntent.setData(Uri.parse(url.toString())); } startActivity(activityIntent); } else { Toast.makeText(this, packageName + " installed", Toast.LENGTH_LONG).show(); } }
サービスなんかなくてもBaseApplicationなんか使わなくても
これだけで動くみたい
ただ、ちょっと問題があってInterpreterConfiguration.startDiscoveringがスレッド実行してるため
直後にインスタンス使ってもうまく動かないみたい
startDiscoveringはonCreateででもやっとくかsleep入れないといけない
動かし方も分かったけど、CGIとして動かすためには
環境変数入れてPOSTのボディを標準入力に入れて標準出力をパクらなければいけない
ついでにQUERY_STRINGを引数に入れるんだっけ?こっちはあんまし使わないから最悪なくてもいいや
やり方調べる