IBM Websphere Everyplace Micro Edition(WEME)との格闘の記録
と、いうわけで、「いろいろ(中略)」を。以降、WEMEのVMのことをj9と呼称します。今までもそうしてきましたけど。
まず、なんでj9のインストールに失敗していることに気づいたかというと、マニュアル(英語版。日本語マニュアルは訳あって読めなかったから(^^;))に「入っている」と書かれているサンプルが見あたらなかったからです。
しばらくインストールとアンインストールを繰り返してためしているうち、よく見るとインストール後のメッセージがいつもとびみょーに異なることに気づきました。
曰く
インストールに失敗しました。アンインストールしてください。
と(^^;)。ちゃんとメッセージよめ>自分
インストールに失敗したのはおそらくディスクの容量の所為であろうと当たりをつけ、いくつかためしてみました。
- ipkを本体RAMに、インストール先も本体RAMに(のこり3M)->失敗
- ipkをSDに、インストール先も本体RAMに(のこり6M)->失敗
- ipkをSDに、あらかじめJ2MEPPをアンインストールした上でインストール先も本体RAMに(のこり9M)->成功
インストール後のイメージとしては約4Mbyteとのことなので(tar+gzipで展開してみた)、data,controlの用テンポラリとして本体メモリ(/home)を使用しているのでしょうね。4Mbyte+3Mbyte=7Mbyteなので、9Mbyteあれば展開できるのは説明が付きます。
これで、インストール後のメッセージは見慣れた「×を二回タップ」になりました。golftrackerも入ったし。タブを一個追加されるのは邪魔っけだけど。
今度は、antをj9を使うように変更します。なにせ、j2meppはアンインストールしちゃったので。
- /home/QtPalmtop/antをmabさんのスクリプトからj9のclasses.zipを参照するように変更。
- j2meppを実行しているものをstartj9pproへのフルパスに変更
すくなくとも、これでjikesを使ってコンパイルは正常に動くようになりました。
次に、antのjavacタスクをEclipse経由で行うようにbuild.xmlを修正してみました。
isobeさんに教えていただいたサイトを元に
- build.compilerプロパティにorg.eclipse.jdt.core.JDTCompilerAdapterを指定
- antスクリプト内のclasspathにorg.eclipse.jdt.coreのjdtcore.jarを追加
- antスクリプト内のclasspathにorg.eclipse.jdt.coreのjdtCompilerAdapter.jarを追加
ところが、このままではNoClassDefFoundErrorが出ます。どうにもクラスが足りないようですので、どんどんjarファイルを追加します。具体的には以下です。
で、最後のExceptionまで引っ張ったところ、どうやら、
- org.eclipse.jdt.internal.core.search.indexing.IndexManager.getJavaPluginWorkingLocation()でNullPointerException
うーむ、このメソッドが何やってるかきちんと調べないと対策できないなぁ……。
と、いうわけで、一旦この方法は諦め。今に見てろ。覚えてやがれ(負け犬の遠吠え(^^;))。
で、ひじょーに単純に以下のようなスクリプトを作ってコンパイルすることにしました。
#!/bin/sh
javac -d bin src
元がsrc内のソースをbinにクラスの形でコンパイルというツリーだったので。どうでもいいんですけど、Eclipseのコンパイラって-sourcepathオプション、使えないんですね。ちょっと填りました。
javacは以下のような単純なシェルスクリプトです。
#!/bin/sh
cvm -classpath /mnt/card/j2mepp/jdtcore.jar org.eclipse.jdt.internal.compiler.batch.Main -bootclasspath /mnt/card/j2mepp/btclasses.zip $1 $2 $3 $4 $5 $6 $7 $8 $9
cvmというシェルスクリプトも作りました。cvmって名前のくせに、これの本体はj9という邪道なものではあるのですが……。
#!/bin/sh
cmd=/home/QtPalmtop/j9/ppro10/bin/startj9ppro
$cmd $1 $2 $3 $4 $5 $6 $7 $8 $9
shiftとか使ってきちんと作れってば(^^;)>自分
いいの、動けば。
ともあれ、なんとかコンパイルは通るようになりました。
次、write once,run anywhreを実現するために、文字コードをutf-8からsjisに。というのも、元々は携帯電話(MIDP,DoJa)に簡単にポーティングするためのプロトタイピングにZaurusを使っている関係上、それぞれのビルド用ツールがソースにsjisを要求するためutf-8では都合が悪いのです。
幸いにして、j9はsjisが通ることをちょっとしたテストプログラムで確認できたので、コンパイル用のシェルスクリプトを以下の形に直しました。
ソースをsjis/CRLFに直した上で再コンパイル。正常にコンパイルは通りました。
で、ここからが問題だったのですが、出来上がったものを、実際に動かしてみることに。
cvm hoge
すると、KeyAdapter経由ではなぜかキーが取れないという……。試しにKeyAdapter#keyPressed(KeyEvent e)に
System.out.println(e.toString());
と、あからさまなデバッグコードを入れてみたのですが、全く引っかかりません。
試しにj2meppをもう一度インストールし直して動かしてみるときちんと引っかかりますし、当然の事ながらクラスファイルをWindowsに持っていっても動きます。先にも書きましたが、sunのjava5のVMでも、WEMEのVMでも。
理由はわからないのですが、j9ではKeyAdapterがうまく使えないのは確かなようです。
そこで、今は以下のポリシーで動かしています。
グラフィックのロードとかはj9の方が明らかに速いし、全体的に画面出力処理はj9の方が速めっぽいんだけどなぁ。でも、SL-C700のjeodeのほうがもっと速かったりして(^^;)>画面出力
ともあれ、そんなこんなでセルフコンパイル環境は何とか整ったのでした。
今回の勝利の鍵は
- ipkを展開するときには/homeに十分な空き領域を
これにつきます。とほほ。jikesにくらべてEclipseのコンパイラは明らかに遅いですが、まぁ、これは仕方ないよなぁ……。