日記帳

日記です。

Android で Rhino を使って JavaScript インタープリタを動かしてみる

AndroidiPhone と違ってインタープリタや言語処理系が禁止されていないはずなので試しに動かしてみました. 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); の部分がポイント. ここで最適化を無効にしておかないと RhinoJVMバイトコードを生成してしまい Dalvik VM で動作しなくなってしまうっぽい. js.jar から最適化部分のクラスを削除して最適化機能自体を無効にするって方法もありそうだけどとりあえず.

今回は Java で書かれたアプリケーションに組み込んだけどいっそ全部 JavaScript だけでアプリを書いてもいいんじゃないだろうか? Android アプリの Java のコード部分って結構コントローラ的なコードが多い気がするんでそれほど速度が要求される訳じゃないし… 本当に効率性が求められるところは NDK で書くとか.

ODROID さんたちと搭載センサー

ODROID と ODROID-S の搭載しているセンサーについて調べてみるためにセンサー一覧を表示するアプリを書いてみた.

インストールして実行するとセンサーの種類とセンサーの名前が表示されます.

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メモリ

USBメモリを2つほど試してみたけど反応なし.サポートしていない模様.

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 connection management modify
  • WiFi speed improvement.

ということなのでこちらも更新しておきます.ためしに自宅の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 さん


開発機としてがんばるODROIDさん。


よい点。

  • microSD 差し替えるだけでOSが変更できる
  • OS 壊れてもmicroSDに書き込めはすぐリストアできる
  • CPU割と速い
  • メモリも余裕がある

不満点。

  • Wifi 接続がいまいち安定しない
  • カメラ、GPS がないのでその辺の実験はできない
  • 加速度センサー以外のセンサーがないのでその辺の実験できない
  • Android Market につながらない

そんな感じで欠点もあるけど我が家唯一の 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さん
    • android 端末をコントローラにする話
    • wifi でつなぐのは見たことある気がするけど Bluetooth で通信してるのは珍しいかも
  • isshiki さん
    • SDL ゲームで赤青立体視
    • ちゃんと調整されてるようで立体に見えます
    • でもちょっと酔う
    • 赤青メガネありがとうございます.
  • fslasht さん
    • JavaScript ゲームの「たぬきゃっち」デモ
    • NetWalker の chronium が思った以上に速い
    • WindowsMobile の Willcom03 にも速いブラウザでないかしら…
  • shinhさん
    • WebGLMikuMikuDance のモデルを表示したりするデモ
    • 人の書いたシェーダをリンクはって参照したりできるかも
    • Webブラウザもここまで来たのか…
  • OMEGAさん
    • ActionScript3 と FlashDevelop でゲーム開発の話
    • 普通に参考になる内容で素晴らしい
  • その他