スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

J2ME(S!アプリ)開発日記 その2

Canvasクラスを作ってどうやって描画するか、しっかり考えてからやろうと思ったが、その前に基礎的なことからと思い、今度はどこかのサイトにあったHelloWorldレベルのサンプルから取り掛かった。

特に画面に凝ろうと思わなければこういうテキストベースで作っても実用上いいんじゃないかと思った。ただし貧相な画面だと、どうしても安っぽく見る人が多いのが残念なことだが。

ということで、Canvasで描画せずに、Formクラスを使って、シンプルな構成でいこうと考えた。画面の遷移は、左右のソフトキーを使って行う。このソフトキーは、Commandオブジェクトに割り当てられていて、二つ以上割り当てると、右のソフトキーが「メニュー」に変わり、押すとメニュー画面で選択する形になる。
しかし、これ、ネイティブのアプリのように、元の画面はそのままで、メニューを押したときに、その上の部分だけに、ぴろーとメニューが出てくるようにはできないのだろうか。前Javaアプリでもそういうのを見たことがあるが、あれはどうやっていたのだろうか。ちょっと調べてみたが結局わからなかった。

最初、S! Appli Emulator for JSCL1.3.2を使っていたのだが、MIDP2.0の機能を使うには、MEXAを使う必要があることがわかった。
しかし、MEXAエミュレータを使おうとすると、StorageConnectionへのキャストのところで、なぜかNoClassDefFoundエラーが出てしまう。いろいろ試してもさっぱりわからない。
あとで原因がわかったのだが、とりあえず、S! Appli Emulator for JSCL1.3.2でも開発はできたので、そっちで進めた。

MIDP2.0もそうだが、CLDC1.1にも対応していない。J2MEの構成は、コアとなるConfigurationの上に、携帯独自のProfile(MIDP)からなっている。さらにその上にキャリア独自のAPIが追加されたりする。
Configurationはjava.lang, java.util, java.ioと基本的なネットワーク機能のAPIが定義されている。この基本的なパッケージもかなり限られていて、使いづらいことこの上ない。CLDC1.0では浮動小数点の計算に対応していなかったり、Mathクラスのメソッドも貧弱で、CLDC1.1の使えるMEXAにしなきゃと思いつつも、なんとか工夫したらできたので、そのまま、S! Appli Emulator を使い続けた。

それにしても、こんな貧弱なAPIでみんな開発しているのだろうか。たぶん追加でいろいろ入れるのだろうが、おそらくロジックはあまり複雑なものは組まず、描画やハードとの関連の部分を解決するのが、開発の重点とされているのかもしれない。実際、キャリアの拡張はハードがらみのところにある。携帯に載せているメールやオーディオプレーヤーの対応など。

MIDPで定義されている画面用のクラスとしては、最上位にDisplayableがあり、その下にScreenとCanvasクラスがある。Canvasクラスは自由に描画してグラフィカルな画面を作ることができる。たいていのアプリはこちらを使っている。
Screenクラスは、Alert, Form, List, TextBoxなどのサブクラスがあり、こちらが画面用コンポーネントだ。しかし、VBやawtなどのコンポーネントに比べて非常に貧弱だ。特に、MIDP1.0では、テキストを扱っているのと変わりない。テキストボックスやチェックボックス、ラジオボタンなどはある。MIDP2.0でボタンやリンクやプルダウンなどが追加されたので、そこそこできるが、扱えるフォントは限られているし、色もつけられない。

せめて字体の色、背景色、各コントロールの色を指定できたら、だいぶ見栄えがよくなるのだが。どうして色指定ができないのだろうか。

フォントのサイズも、端末依存だが、904SHだとネイティブだと5段階設定できるが、Javaだと3段階で、私としてはネイティブでの小で設定したいのだが、SMALLにすると最小になってしまう。これだと小さすぎるし、かといって標準だと大きすぎる。

最初、CLDC1.0, MIDP1.0でやっていて、それでもStorageConnectionで外部メモリにアクセスすることはできるので、この方が対応機種も増えていいのではと思っていた。

MEXAエミュレータが使えるようになってからも、S! Appli Emulatorの方が簡単なので、そちらを使い続けた。EclipseでAntを実行して、あとエミュレータでRUNボタンを押すだけ。一方、MEXAでは、Ant実行後、JADファイルを修正し、そしてエミュレータ上でインストール作業を行って、Launchボタンを押してと、非常に面倒くさい。

AntにはサポートサイトにあったZentekAntTasks.jarを使っていたが、JADファイルの頭に3行の変なヘッダを加える上、長い行を改行してしまうので、非常に迷惑だ。
MEXAエミュでは、セキュリティもエミュレートしていて、MIDlet-Permissionsを指定しないと、StorageConnectionが使えない。JADファイルの先頭に追加される属性は、エミュレータでは問題なかったが、アプリゲットにアップロードするとき、先頭がMidlet-属性のものが来ないとエラーになってしまう。

で、MEXAエミュレータで、NoClassDefFoundErrorが出ていた理由だが、2chのスレッドを見ていたら答えが見つかった。
MIDxlet-API: JSCL-1.4.2
が必要だったのだ。資料をきちんと読めばわかったかもしれないが、みようみまねで作っていてはこんなことは絶対わからない。この情報には非常に助かった。これがなかったらドキュメントを一から読み漁らないとわからなかったかもしれない。しかし、JADの指定で、NoClassDefとは。
てっきり、クラスパスに存在しないのだろうかと、そこばかり気になって、試行錯誤していた。

教訓:エラーメッセージを真に受けないこと。

まあ、この場合、JADで指定されたプロファイルでは、クラスが見つからないということで、正しいといえば正しいのだが。


関連記事
スポンサーサイト

コメント

非公開コメント

プロフィール

dayan

Author:dayan
小職は、SE(システムエンジニア)を専門としておりますが、技術的な情報を中心に、それ以外に経済関連の日記、たわいもない日記も載せていきます。
[公式HPもよろしく!]

天気予報

-天気予報コム- -FC2-
リンク
ブロとも申請フォーム

この人とブロともになる

カテゴリー
最近の記事
ブログ内検索
最近のコメント
最近のトラックバック
RSSフィード
月別アーカイブ


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。