読者です 読者をやめる 読者になる 読者になる

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を引数に入れるんだっけ?こっちはあんまし使わないから最悪なくてもいいや
やり方調べる