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 で書くとか.
ODROID さんたちと搭載センサー
ODROID と ODROID-S の搭載しているセンサーについて調べてみるためにセンサー一覧を表示するアプリを書いてみた.
インストールして実行するとセンサーの種類とセンサーの名前が表示されます.
まとめ
センサーの種類 | ODROID | ODROID-S |
---|---|---|
TYPE_ACCELEROMETER | O | O |
TYPE_MAGNETIC_FIELD | X | O |
TYPE_ORIENTATION | X | O |
TYPE_GYROSCOPE | X | X |
TYPE_LIGHT | X | X |
TYPE_PRESSURE | X | X |
TYPE_TEMPERATURE | X | X |
TYPE_PROXIMITY | X | X |
TYPE_MAGNETIC_FIELD と TYPE_ORIENTATION が使えるようになってますね.つまり磁気センサーが追加されたということでしょうか.光センサーや近接センサーが搭載されていないのが残念ですがODROIDに比べれば一歩進歩でしょうか.
ODROID-S の各種機能とか
ODROID-S をいろいろ試してみた.
プレインストールされているアプリケーション
ODROID-S で Android 標準に加えてインストールされているアプリケーション一覧です.
- SlideME Marketplace
- Mediaplayer
- Aldiko
- ゲームの試用版が数本
- ハングル入力用のキーボードアプリケーション
SlideME Marketplace は マーケットアプリケーションです. ODROID-S は Android Market に接続できないためアプリケーションの追加はこのアプリケーションで行うか野良アプリケーションを入れることになります.
Mediaplayer はメディアプレイヤーアプリケーションで普通のギャラリーでは再生できないような高画質動画が再生できます.SoCの動画デコード機能みたいなものを利用しているのだと思います.ODROID-S の場合は Full HD の mp4 まで再生できます.
Aldiko は Android 用の eBook リーダーで,サイトは http://www.aldiko.com/ ですね.これは ODROID には入ってなかったので ODROID-S で追加されたものですかね… いくつかのフリーの電子書籍がダウンロードできたり,O'Reilly の電子書籍が購入できたりするようです.もちろん全部英語の本ですが…
ゲームの試用版各種はだいたい全部どうでもいい内容です.その上試用版なので一定時間遊ぶと遊べなくなります.すみやかにアンインストールすることをお勧めします.
ハングル入力用のキーボードは…使うなら使えばいいですし使わないならアンインストールですよね.
HDMI による外部ディスプレイ出力
ODROID と同様に mini HDMI 端子がついておりで HDMI ケーブルでテレビやディスプレイに映像と音声が出力できます.ケーブルをつなげば即出力されるので特に悩むところはないと思います. 「設定」の「サウンド&画面設定」に「TV Mode」という項目ができており,以下の5つから外部出力するフォーマットを選択できます.
- 1080P
- 1080i
- 720P
- 576P
- 480p
デフォルトで 1080p に設定されていたのでディスプレイの仕様にあわせて変更するといいでしょう.この設定は ODROID のときにはなかったので ODROID-S で追加されたようですね.
USB ホスト機能
ODROID-S には USB ホスト機能がついておりIOポートからUSB A に変換するアダプタが付属していました.このアダプタを利用して本体についていないカメラやGPSを追加できるらしいということでいくつか試してみた.
USBキーボード
101英語キーボードを繋げると認識して普通にキーボードとして入力できました.横画面にしたときのカーソルキーの方向がおかしいのは愛嬌でしょうか?
USBマウス
認識した.Android 端末についているトラックボールと同じような動作をするようです.
つまりマウスポインターが出る訳ではなくて,マウスの上下左右への移動にあわせてフォーカスが移動していく感じです.実際にUSB接続のトラックボールをつなげればそれっぽく使えるかもしれません.
USBカメラ
Microsft NX-6000 をためしてみた.接続してカメラアプリを起動したみましたがすぐに異常終了してしまいました. カメラを接続しないで起動しても同じ反応なので認識していないのかもしれません.
ODROID さんずのOS更新
日本中で何台売れたのだろうか?と思わずにいられない OSROID-S ですが 7/31 に新しいファームウェアが出ているようなので更新しました.
http://dev.odroid.com/projects/odroid-t/download
上のサイトの Odroid-S-20100713.zip odroids_recovery_2010730.zip が最新のODROID-S用です.更新履歴は以下の通り.
- Multi-input Key scan problem is fixed.
- WiFi speed improvement. (200kbyte/s -> 800kbyte/s)
- USB camera is implemented. (Only UVC type is tested)
- USB GPS support (Only ACM type is tested)
バグ修正の他にUSB 接続のカメラとGPSのサポートが入ったようですね.
このファイルを取得して展開するとイメージファイルと microSD に書き込むツールが入っているので適当な Windows PC に microSD を接続してツールを立ち上げます.
書き込みツールも地味に更新されてますね… ファイルを選んでSTARTボタンを押すだけ.書き込みは3,4分くらいかかったかも.
ついでに ODROIDの方 はどうなってるのかな,と思ってみて見ると 8/5 にファームウェアがリリースされていますね…
ということなのでこちらも更新しておきます.ためしに自宅のWifiにつないでみると以前の不安定さが嘘のように一発でつながりました!前はあんなにアクセスポイントを選り好みしていたのに…
Mac OS X と Objective-C 2.0 の Object クラス
Foundation Framework の NSObject じゃなくて Object クラスの話です.
久しぶりに昔書いた Objecive-C のコードを Mac OS X 上でいじってたら軒並み動かなかった.よくわからないので適当にテストコードを書いてみる.
#include <stdio.h> #include <objc/Object.h> @interface Hello : Object { char *message; } + newWithMessage:(const char *)message; - initWithMessage:(const char *)message; -(void)printMessage; @end @implementation Hello + newWithMessage:(const char *)aMessage { return [[self alloc] initWithMessage:aMessage]; } - initWithMessage:(const char *)aMessage { self = [super init]; message = aMessage; return self; } -(void)printMessage { printf("%s\n", message); } @end int main(int argc, char* argv[]) { id hello = [Hello newWithMessage:"Hello, Objective-C World!!"]; [hello printMessage]; return 0; }
こんな感じの hello.m を書いて以下のようにコンパイル.
$ gcc -o hello hello.m -lobjc hello.m: In function ‘+[Hello newWithMessage:]’: hello.m:21: warning: ‘Hello’ may not respond to ‘+alloc’ hello.m:21: warning: (Messages without a matching method signature hello.m:21: warning: will be assumed to return ‘id’ and accept hello.m:21: warning: ‘...’ as arguments.) hello.m: In function ‘-[Hello initWithMessage:]’: hello.m:25: warning: ‘Object’ may not respond to ‘-init’ hello.m:26: warning: assignment discards qualifiers from pointer target type
Object クラスにクラスメソッド alloc やメソッド init がないと警告がでる. 実行ファイルはできたので実行してみたら以下のようなエラーが出て動かない.
$ ./hello objc[73654]: Hello: Does not recognize selector forward:: Illegal instruction
alloc なかったらどうやってオブジェクト作ったらいいんだろう?
とりあえず /usr/include/objc/Object.h を見てみる.
#if __OBJC2__ @interface Object { Class isa; /* A pointer to the instance's class structure */ } +class; -(BOOL) isEqual:anObject; @end #else @interface Object { Class isa; /* A pointer to the instance's class structure */ } /* Initializing classes and instances */ + initialize; - init; /* Creating, copying, and freeing instances */ + new; + free; - free; + alloc; <略> @end
どうやら __OBJC2__ マクロが定義されているとメソッドが軒並みなくなるらしい… Objective-C 2.0 で GC が導入された関係かな?
試しに __OBJC2__ を未定義にしてコンパイルして実行してみる.
$ gcc -o hello hello.m -U__OBJC2__ -lobjc $ ./hello objc[74015]: Illegal instruction
コンパイル時に警告は出なくなったが実行時エラーが起きるのはかわらない. ヘッダだけをごまかしても同じライブラリを同じようにリンクしているなら当然の結果か…
Objective-C 2.0 じゃない状態(1.0?)でコンパイルするにはどうすればいいのかしら?
ODROID さん
よい点。
不満点。
そんな感じで欠点もあるけど我が家唯一の Android 端末としてがんばっていましたが…
ODROID-S : 「きたよ!兄さん」
ODROID : 「きたか、弟よ」
ODROID-S : 「僕ら見た目はそっくりだね」
ODROID : 「筺体は使いまわしだしな」
ODROID-S : 「兄さんの方が起動が早いね!」
ODROID : 「弟のほうが CPU が速いはずだろう」
ODROID-S : 「見た目が違うね、OS のバージョンが違うのかな?」
ODROID : 「両方 Android 2.1 update 1 のはずなのだが…」
そんな感じで、我が家で2代目の Android 端末として ODROID-S が届きました。
SDL-off 2010 Summer へ参加
SDL-off 2010 Summer へ参加してきました.SDL-off は SDL に関係があったりなかったりするものを適当に作ったり遊んだり発表したりするおおらかなオフ会です.
各人の発表内容などは,いつもおいしそうな料理の写真が載っている id:fslasht さんのfslasht のグルメ日記,じゃなくて fslasht のサアラたん日記 に詳しいです.
以下雑感.
- kawaoさん
- 自作ゲームフレームワークと作ったゲーム「コネクション・ロード」
- 「コネクション・ロード」リリースおめでとうございます
- いろいろ苦労も多かったようですね…
- tkmtさん
- isshiki さん
- fslasht さん
- JavaScript ゲームの「たぬきゃっち」デモ
- NetWalker の chronium が思った以上に速い
- WindowsMobile の Willcom03 にも速いブラウザでないかしら…
- shinhさん
- WebGL で MikuMikuDance のモデルを表示したりするデモ
- 人の書いたシェーダをリンクはって参照したりできるかも
- Webブラウザもここまで来たのか…
- OMEGAさん
- ActionScript3 と FlashDevelop でゲーム開発の話
- 普通に参考になる内容で素晴らしい
- その他