講演使用スライドのダウンロード

Download Report

Transcript 講演使用スライドのダウンロード

オープンアプリ(JavaTM)開発講座
株式会社 ユビキタスエンターテインメント
布留川 英一
2007/1/13
目次
• オープンアプリ(JavaTM)の作成
–
–
–
–
Java言語の特徴
Java実行環境の構成
オープンアプリ(JavaTM)の作成手順
はじめてのオープンアプリ(JavaTM)の作成
• オープンアプリ(JavaTM)への移植
– アプリの制限事項
– iアプリをオープンアプリ(JavaTM)へ移植
– S!アプリ・Javaアプリをオープンアプリ(JavaTM)へ移植
オープンアプリ(JavaTM)の作成
Java実行環境(1)
特徴1 機種依存を最小限に抑える
C言語
Windows用ネイティブコード
Mac用ネイティブコード
Windows
Mac
プラットフォームごとに
異なるネイティブコード
が必要
Java言語
Javaバイトコード
Windows用JVM
Mac用JVM
Windows
Mac
Javaバイトコードは
JVMを介して様々
なプラッットフォームで
動く
Java実行環境(2)
特徴2 プログラムが暴走してもネイティブ領域に悪影響を与えない
C言語
ネイティブ領域
データ破壊
プログラム
Java言語
ネイティブ領域
暴走
プログラムが暴走すると
ネイティブ領域にまで悪影響が及ぶ
おかしな処理をしても教えてくれない
入念なデバッグ・検証が必要
悪影響なし
JVM
プログラム
暴走
プログラムが暴走しても
ネイティブ領域にまで悪影響を与えない
サンドボックスモデルで保護
Java実行環境(3)
Java実行環境の構成
オプション
JavaME
オプション
オプション
JavaEE
JavaSE
JVM
オプション
Foundation
DoJa MIDP
CDC
CLDC
KVM
オープンアプリ(JavaTM)の作成手順(1)
オープンアプリ(JavaTM)の作成手順
テキストエディタ
グラフィックスソフト
シーケンスソフト
ソースコード(java)
画像ファイル(png,jpg)
サウンド(mid,wav)
ビルド+パッケージを作成
属性設定
J2ME Wireless Toolkit
JARファイル(jar)
JADファイル(jad)
オープンアプリ(JavaTM)の作成手順
オープンアプリ(JavaTM)のダウンロード
サーバー
ダウンロードページを開く
XHTMLファイル
ダウンロードリンクをクリック
実機で動作可能かチェック
アプリのダウンロード
JADファイル
JARファイル
はじめてのオープンアプリ(JavaTM)の作成(1)
開発ツール
• JDK 5.0(Java SE Development Kit)
• J2ME Wireless Toolkit 2.2
• テキストエディタ
はじめてのオープンアプリ(JavaTM)の作成(2)
プロジェクトの作成
1.「KToolbar」の「新規作成」ボタンを押す
2.プロジェクト名とクラス名にHelloWorldと入力
新しくHelloWorldフォルダが生成される
3.APIの選択でJTWIのCLDC1.1を選択
プロジェクトフォルダの中身
フォルダ
中身
bin
JARファイルとJADファイル
lib
ライブラリ
res
画像ファイルやサウンドファイル
src
ソースコード
はじめてのオープンアプリ(JavaTM)の作成(3)
ソースコードの作成
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
//HelloWorld(本体)
public class HelloWorld extends MIDlet {
//コンストラクタ
public HelloWorld() {
Display.getDisplay(this).
setCurrent(new HelloCanvas());
}
//アプリの開始
public void startApp() {
}
//アプリの一時停止
public void pauseApp() {
}
//アプリの終了
public void destroyApp(boolean flag) {
}
}
//HelloWorld(キャンバス)
public class HelloCanvas extends Canvas {
//描画
public void paint(Graphics g) {
g.setColor(255,255,255);
g.fillRect(0,0,getWidth(),getHeight());
g.setColor(0,0,0);
g.drawString("Hello World!",0,5,
Graphics.LEFT|Graphics.TOP);
}
}
はじめてのオープンアプリ(JavaTM)の作成(4)
JARファイルの作成
1.「KToolbar」の「ビルド」ボタンを押す
2.「KToolbar」のメニュー「プロジェクト⇒パッケージ⇒パッケージを作成」を選択
エミュレータでの実行
1.「KToolbar」の「実行」ボタンを押す
実機での実行
1.「JARファイル」「JADファイル」「XHTMLファイル」のアップロード
2.実機でXHTMLにアクセスしアプリをダウンロードして実行
はじめてのオープンアプリ(JavaTM)の作成(5)
サーバーの設定
Content-Lengthヘッダに対応する必要がある。
Content-Typeとして以下のMIMEタイプに対応する必要がある。
拡張子
MIMEタイプ
.jad
text/vnd.sun.j2me.app-descriptor
.jar
application/Java-archive
ダウンロード用HTML
<html><body>
オープンアプリゲーム</br>
以下のリンクをクリックしてください。
<a href="device:jam?http://npaka.net/hoge.jad">ダウンロード</a>
</body></html>
オープンアプリ(JavaTM)への移植
アプリの制限事項(1)
APIの違い
コンフィギュレーション
プロファイル
オプションAPI
オープンアプリ(JavaTM)
CLDC
MIDP
なし
iアプリ
CLDC
DoJa
-
S!アプリ
CLDC
MIDP
JSCL
VSCL
MEXA
Javaアプリ(Willcom)
CLDC
MIDP
SDバインド
アプリの制限事項(2)
実行ファイルのサイズ制限
実行ファイルサイズ+データ保存領域サイズ
オープンアプリ(JavaTM)
300KB+32KB
iアプリ
合計で1MB(903)
100KB+400KB(902以前)
30KB+200KB(70X)
S!アプリ
合計で1MB(3GC)
合計で256KB(P5型,P6型)
Javaアプリ(Willcom)
1MB+512KB
アプリの制限事項(3)
画面・フォントのサイズ制限
画面サイズ
フォントサイズ
オープンアプリ(JavaTM)
240x268
12,16,20ドット
iアプリ
240x240程度
12,16(まれに20),24ドット
S!アプリ
240x240程度
Javaアプリ(Willcom)
240x240程度
12,20ドット
12,16,20ドット(まれに12のみ)
※VGA端末(640x480程度)もたまにあります。
アプリの制限事項(4)
リソースの制限
画像
サウンド
オープンアプリ(JavaTM)
PNG,JPEG
MIDI,WAVE,Tone Sequence
iアプリ
GIF,JPEG
MLD
S!アプリ
PNG,JPEG
Javaアプリ(Willcom)
PNG,JPEG
SMAF,SMAF/Phrase
MIDI
アプリの制限事項(5)
通信量の制限
通信量の制限
オープンアプリ(JavaTM)
1接続32KB
1日3MB。通信規制は午前1時にリセット
iアプリ
1接続150KB
1日の通信量制限はない
S!アプリ
1日の通信量制限はない
Javaアプリ(Willcom)
1日の通信量制限はない
iアプリをオープンアプリ(JavaTM)に移植(1)
本体となる親クラス
DoJa
MIDP
本体の親クラス
com.nttdocomo.ui.IApplication
javax.microedition.midlet.MIDlet
アプリの開始
start()
コンストラクタ,startApp()
アプリの一時停止
なし
アプリの再開
resume()
pauseApp()
startApp()
アプリの終了
なし
destroyApp(boolean)
iアプリをオープンアプリ(JavaTM)に移植(2)
本体となる親クラス
import com.nttdocomo.ui.*;
//本体
public class A extends IApplication {
static A a;
static B b;
//アプリの開始
public void start() {
a=this;
b=new B();
Display.setCurrent(b);
b.run();
}
//アプリの再開
public void resume() {
}
}
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
//本体
public class A extends MIDlet {
static A a;
static B b;
//アプリの開始
public A() {
a=this;
b=new B();
Display.getDisplay(this).setCurrent(b);
(new Thread(b)).start();
}
//アプリの復帰
public void startApp() {}
//アプリの一時停止
public void pauseApp() {}
//アプリの終了
public void destroyApp(boolean uncond) {}
}
iアプリをオープンアプリ(JavaTM)に移植(3)
キーイベント
キーイベント用のラッパークラスを作ることによって、移植作業を軽減させることができる。
DoJa
MIDP
キャンバスの親クラス
com.nttdocomo.ui.Canvas
javax.microedition.ui.Canvas
キープレス
processEvent(int,int)
keyPressed()
キーリリース
processEvent(int,int)
キーリピート
なし
keyReleased()
keyRepeated()
キー状態取得
getKeypadState()
keyPressed()
keyReleased()
ソフトラベル指定
setSoftLabel(int ,String)
addCommand(Command)
ソフトキープレス
processEvent(int,int)
commandAction()
iアプリをオープンアプリ(JavaTM)に移植(4)
private int keypadState;//キー状態
private String[] softLabel=new String[2];//ソフトラベル
private javax.microedition.lcdui.Command[] softKey=//ソフトキー
new javax.microedition.lcdui.Command[2];
//ソフトラベル
protected void setSoftLabel(int key,String label) {
//初期化
if (softKey[0]==null) {
softLabel[0]="";
softLabel[1]="";
softKey[0]=new javax.microedition.lcdui.Command(
"",javax.microedition.lcdui.Command.SCREEN,0);
softKey[1]=new javax.microedition.lcdui.Command(
"",javax.microedition.lcdui.Command.SCREEN,1);
addCommand(softKey[0]);
addCommand(softKey[1]);
}
//ソフトキー1・2変更
if (key==Canvas.SOFT_KEY_1) {
if (softLabel[0].equals(label)) return;
removeCommand(softKey[1]);
removeCommand(softKey[0]);
softLabel[0]=label;
softKey[0]=new javax.microedition.lcdui.Command(
label,javax.microedition.lcdui.Command.SCREEN,0);
addCommand(softKey[0]);
addCommand(softKey[1]);
}
//ソフトキー2変更
else {
if (softLabel[1].equals(label)) return;
removeCommand(softKey[1]);
softLabel[1]=label;
softKey[1]=new javax.microedition.lcdui.Command(
label,javax.microedition.lcdui.Command.SCREEN,1);
addCommand(softKey[1]);
}
}
//キープレスイベント
public void keyPressed(int keyCode) {
int key=getKey(keyCode);
keypadState|=(1<<key);
canvas.processEvent(
Display.KEY_PRESSED_EVENT,key);
}
//キーリリースイベント
public void keyReleased(int keyCode) {
int key=getKey(keyCode);
keypadState^=(1<<key);
canvas.processEvent(
Display.KEY_RELEASED_EVENT,key);
}
//コマンドイベント
public void commandAction(javax.microedition.lcdui.Command c,
javax.microedition.lcdui.Displayable s) {
if (c==softKey[0]) {
canvas.processEvent(Display.KEY_PRESSED_EVENT,Display.KEY_SOFT1);
} else {
canvas.processEvent(Display.KEY_PRESSED_EVENT,Display.KEY_SOFT2);
}
}
//キー状態の取得
protected int getKeypadState() {
return keypadState;
}
iアプリをオープンアプリ(JavaTM)に移植(5)
//キーの取得
private int getKey(int keyCode) {
switch(keyCode) {
case 0:return Display.KEY_CLEAR;
case KEY_NUM0:return Display.KEY_0;
case KEY_NUM1:return Display.KEY_1;
case KEY_NUM2:return Display.KEY_2;
case KEY_NUM3:return Display.KEY_3;
case KEY_NUM4:return Display.KEY_4;
case KEY_NUM5:return Display.KEY_5;
case KEY_NUM6:return Display.KEY_6;
case KEY_NUM7:return Display.KEY_7;
case KEY_NUM8:return Display.KEY_8;
case KEY_NUM9:return Display.KEY_9;
case KEY_STAR:return Display.KEY_ASTERISK;
case KEY_POUND:return Display.KEY_POUND;
default:
switch(getGameAction(keyCode)) {
case UP:return Display.KEY_UP;
case DOWN:return Display.KEY_DOWN;
case LEFT:return Display.KEY_LEFT;
case RIGHT:return Display.KEY_RIGHT;
case FIRE:return Display.KEY_SELECT;
case GAME_A:return Display.KEY_GAME_A;
case GAME_B:return Display.KEY_GAME_B;
case GAME_C:return Display.KEY_GAME_C;
case GAME_D:return Display.KEY_GAME_D;
}
}
return keyCode;
}
iアプリをオープンアプリ(JavaTM)に移植(6)
グラフィックス
グラフィックス用のラッパークラスを作ることによって、移植作業を軽減させることができる。
DoJa
MIDP
グラフィックスのクラス
com.nttdocomo.ui.Graphics
javax.microedition.ui.Graphics
色の指定
g.setColor(g.getColorOfRGB(
255,255,255));
g.setColor(g.getColorOfName(
g.WHITE));
g.setColor(255,255,255);
文字列の描画
g.drawString("test",0,12);
イメージの描画
g.drawImage(image,0,0);
g.drawString("test",0,12,
g.LEFT|g.BASELINE);
g.drawImage(image,0,0,
g.LEFT|g.TOP);
ロック
g.lock();
なし
アンロック
g.unlock(true);
flushGraphics();
iアプリをオープンアプリ(JavaTM)に移植(7)
import javax.microedition.lcdui.*;
//Graphicsラッパー
class G {
//色定数
static int AQUA =( 0<<16)+(255<<8)+255;
static int BLACK =( 0<<16)+( 0<<8)+ 0;
static int BLUE =( 0<<16)+( 0<<8)+255;
static int FUCHSIA=(255<<16)+( 0<<8)+255;
static int GRAY =(128<<16)+(128<<8)+128;
static int GREEN =( 0<<16)+(128<<8)+ 0;
static int LIME =( 0<<16)+(255<<8)+ 0;
static int MAROON =(128<<16)+( 0<<8)+ 0;
static int NAVY =( 0<<16)+( 0<<8)+128;
static int OLIVE =(128<<16)+(128<<8)+ 0;
static int PURPLE =(128<<16)+( 0<<8)+128;
static int RED =(255<<16)+( 0<<8)+ 0;
static int SILVER =(192<<16)+(192<<8)+192;
static int TEAL =( 0<<16)+(128<<8)+128;
static int WHITE =(255<<16)+(255<<8)+255;
static int YELLOW =(255<<16)+(255<<8)+ 0;
//変数
Graphics g;//グラフィクス
//コンストラクタ
G(Graphics g) {
this.g=g;
}
//文字列の描画
void drawString(String str,int x, int y) {
g.drawString(str,x,y+2,Graphics.LEFT|Graphics.BOTTOM);
}
//イメージの描画
void drawImage(Image image,int x,int y) {
g.drawImage(image,x,y,Graphics.LEFT|Graphics.TOP);
}
//ラインの描画
void drawLine(int x1,int y1,int x2,int y2) {
g.drawLine(x1,y1,x2,y2);
}
//矩形の描画
void drawRect(int x,int y,int width,int height) {
g.drawRect(x,y,width,height);
}
//矩形の塗り潰し
void fillRect(int x,int y,int width,int height) {
g.fillRect(x,y,width,height);
}
//円弧の塗り潰し
void fillArc(int x,int y,int width,int height,int startAngle,int arcAngle) {
g.fillArc(x,y,width,height,startAngle,arcAngle);
}
//フォントの設定
void setFont(Font font) {
g.setFont(font);
}
//色の取得
static int getColorOfName(int name) {
return name;
}
//色の取得
static int getColorOfRGB(int red,int green,int blue) {
return (red<<16)+(green<<8)+blue;
}
//色の設定
void setColor(int color) {
g.setColor(color);
}
//ロック
void lock() {
}
//アンロック
void unlock(boolean forced) {
A.b.flushGraphics();
}
}
S!アプリ・Javaアプリをオープンアプリ(JavaTM)に移植
S!アプリをオープンアプリ(JavaTM)に移植
1.オプションAPIを利用しているヶ所を基本APIで書き直す
2.サウンドファイルを対応する形式に変換する
Javaアプリ(Willcom)をオープンアプリ(JavaTM)に移植
1.仕様は同一なため基本的にそのまま動作する
おわりに
追加情報
サイト
オープンアプリ(JavaTM)
http://www.au.kddi.com/ezfactory/tec/spec/openappli.html
MIDP 2.0メモ
http://npaka.net/kvm/midp2/
書籍
MIDP 2.0 携帯Javaアプリ開発ハンドブック
http://book.mycom.co.jp/book/4-8399-1899-6/4-8399-1899-6.shtml