Android で Rhino を使って JavaScript インタープリタを動かしてみる
Android は iPhone と違ってインタープリタや言語処理系が禁止されていないはずなので試しに動かしてみました. Java ベースの言語処理系なら動くはずです.
以下にサンプルの apk とソースコードを置いておきます.
動かしてみるとこんな感じ.EditText にコードを書いて Run ボタンで実行.p() は表示用関数.
Android での Rhino の使い方は Java の場合と特に変わりません.適当に js.jar をクラスパスに入れて普通にコンパイルするだけ. スクリプトを実行するところは以下のような感じになります.
private void runJavaScript(String script) { Context context = Context.enter(); context.setOptimizationLevel(-1); // use interpreter mode try { Scriptable globalScope = context.initStandardObjects(); String resultString = null; try { Object result = context.evaluateString(globalScope, script, "<EditText>", 1, null); resultString = Context.toString(result); } catch (org.mozilla.javascript.RhinoException jse) { resultString = jse.toString(); } } finally { Context.exit(); } }
context.setOptimizationLevel(-1); の部分がポイント. ここで最適化を無効にしておかないと Rhino が JVM のバイトコードを生成してしまい Dalvik VM で動作しなくなってしまうっぽい. js.jar から最適化部分のクラスを削除して最適化機能自体を無効にするって方法もありそうだけどとりあえず.
今回は Java で書かれたアプリケーションに組み込んだけどいっそ全部 JavaScript だけでアプリを書いてもいいんじゃないだろうか? Android アプリの Java のコード部分って結構コントローラ的なコードが多い気がするんでそれほど速度が要求される訳じゃないし… 本当に効率性が求められるところは NDK で書くとか.