zaurus で GoogleMap もどきがやっとこさ動いてきました。
GM_Liteで切り出した地図を表示して、拡大縮小、スクロールができるようになりました。
ただ、致命的な不具合としては、アプリの切り替えができません。
なぜかわかりませんが、OSごと落ちます
この辺が解消されたら、やっと動いた版として公開しようかなと思います。
長い目でみてやってください。
zaurus で GoogleMap もどきがやっとこさ動いてきました。
GM_Liteで切り出した地図を表示して、拡大縮小、スクロールができるようになりました。
ただ、致命的な不具合としては、アプリの切り替えができません。
なぜかわかりませんが、OSごと落ちます
この辺が解消されたら、やっと動いた版として公開しようかなと思います。
長い目でみてやってください。
昨日の続きです。
昨日の冒頭でも書きましたが、gcc-4.x では x86上で Qt/E アプリをデバッグするためのシミュレータ(?)環境である qvfb 用のバイナリが、コンパイルできませんでした。
おそらく、gcc-2.9x の環境を作ればコンパイルできるのでしょうが、ちょっと手間なので、別の方向で逃げることにしました。
それは、Qt3アプリとして作ってしまうことです。
zaurusのQt2とQt3は上位互換ですが、Qt4からは互換性がないらしいので、Qt 3アプリとしてホスト上である程度作ってしまい、Qt/E用にビルドするときは一部のクラスをQt/E用のクラスに入れ替える方法を取りました。
Qt 環境と Qt/E 環境は細かい所は違うのかもしれませんが、Qt の QApplication を QPEApplication に置き換えれば大体は動くようです。というか、QApplication と QPEApplication を入れ替えれば動くように作ります。
最終段階では qvfb が使えた方がいいのでしょうが、それはその時に考えることにします。
ということで Qt3の環境を整えます。
どれから入れたかは忘れてしまいましたが、今現在Qt3 関係で入っているパッケージは以下のとおりです。
aptでいくつかインストールすれば依存関係でほとんどインストールされてしまうと思います。
これでQt3アプリをビルドする環境が整いました。
Qt3 と Qt/E ではコンパイラもMakefileも異なるので、プロジェクトファイル (*.pro ファイル) を分けることで切り替えます。
例えば、hoge というディレクトリにソース一式が入っており、 hoge というアプリを作るとします。
このとき、Qt3 用には、
$ qmake-qt3 -project $ qmake-qt3 $ make
で プロジェクトファイル hoge.pro、メイクファイル Makefile を作成し、ビルドします。
ARM環境では、プロジェクトファイルの作成に progen、Makefile の作成に tmakeを使います。
$ progen -o hoge-arm.pro $ tmake -o Makefile.arm hoge-arm.pro $ make -f Makefile.arm
これでプロジェクトファイル hoge-arm.pro、メイクファイル Makefile.arm が作成され、ビルド時には make に -f オプションを指定することで、Makefile.arm を使ってビルドします。
実際には、progen で作成した pro ファイルに、
DESTDIR = ./ INCLUDEPATH += $(QTDIR)/library DEPENDPATH += $(QTDIR)/library TARGET = hoge LIBS += -lqpe
を追加する必要がありますが、流れは上記の通りです。
QApplication と QPEApplication は #ifdef で切り替えます。
Qt/E用のビルドでは QWS が define されるようなので、#ifdef QWS で Qt/E と Qt3 を判断します。
こんな感じで
#ifdef QWS #include <qpe/qpeapplication.h> #else #include <qapplication.h> #endif #include "gmap.h" int main(int argc, char **argv) { #ifdef QWS QPEApplication app(argc, argv); GMap *win = new GMap(); app.showMainWidget(win); #else QApplication app(argc, argv); GMap *win = new GMap(); app.setMainWidget(win); win->show(); #endif return app.exec(); }
当分はこの方法で開発を進めてみようと思います。
めざせ Zaurus で GoogleMap ということで、ひとまず開発環境を整えないとです。
SLザウルスが出たのがだいぶ昔なので、Ubuntu に開発環境を構築できるのか? という心配もありましたが、なんとか一応開発できる環境が整いました。
ただ、色々試してみたのですが、x86環境でデバッグするためのqvfb用のバイナリがコンパイルエラーで作れませんでした。ホストの gcc が 2.96 じゃないとコンパイルできないようです。
でも、それじゃいちいち実機でデバッグしないといけなくなるので、qvfbを使わずに x86 上である程度デバッグできるように工夫してみました。
ちなみに使用した OS は Ubuntu 8.04 です。
必要なものをダウンロードします。
ザウルスサポートステーションのLinux関連 開発ツール一覧より
X/Qt Server Projectより (Trolltech社のサイトにはもうありませんでした)
以下は必須ではありませんが、開発入門として参考になるドキュメントです。
Ubuntu はdebian 系なので、一般的には alien を使って rpm を deb パッケージに変換してインストールするのが普通なのですが、私は面倒なので、rpmでインストールしてしまいました。
まずrpmをインストールします。
$ sudo apt-get install rpm
rpmデータベースを作成し、rpm によるインストールを可能にします。
$ sudo mkdir /var/lib/rpm $ sudo rpmdb --initdb
上でダウンロードしたrpmをインストールします。qtopia-free だけ依存関係のエラーがでるので–nodepsで強制インストールします。
$ sudo rpm -ivh binutils-cross-arm-2.11.2-0.i386.rpm $ sudo rpm -ivh gcc-cross-sa1100-2.95.2-0.i386.rpm $ sudo rpm -ivh glibc-arm-2.2.2-0.i386.rpm $ sudo rpm -ivh linux-headers-arm-sa1100-2.4.6-3.i386.rpm $ sudo rpm -ivh --nodeps qtopia-free-1.5.0-1.i386.rpm
Qtopia に 対して Zaurus 用の差分を追加します。libqte も差し替えます。
$ cd /opt/Qtopia $ sudo tar xzf ??????/sharpsdk-pub-20021227.tar.gz $ cd /opt/Qtopia/sharp/lib $ mv libqte.so.2.3.2 libqte.so.2.3.2-bak $ sudo cp ??????/libqte.so.2.3.2.gz . $ sudo gzip -d libqte.so.2.3.2.gz
tmake の設定ファイル(?)を差し替えます。
$ cd /opt/Qtopia/tmake/lib/qws/ $ sudo rm -rf linux-sharp-g++ $ sudo tar xzf ???????/tmake-sharp.tar.gz
以上でインストールは完了です。
ビルドする際に必要な環境変数等を設定するスクリプトが /opt/Qtopia/dev-arm-qpe.sh にあります。
このファイルのままでは、tmake にパスが通っていないため、tmake のパスを追加しておきます。
#!/bin/bash
CROSSCOMPILE=/opt/Embedix/tools
QPEDIR=/opt/Qtopia/sharp
QTDIR=/opt/Qtopia/sharp
PATH=$QTDIR/bin:$QPEDIR/bin:$CROSSCOMPILE/bin:$QPEDIR/bin:/ope/Qtopia/tmake/bin:$PATH
TMAKEPATH=/opt/Qtopia/tmake/lib/qws/linux-sharp-g++/
LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
PS1='!sharp-dev-arm\u@\h:\w\$ '
export QPEDIR QTDIR PATH TMAKEPATH LD_LIBRARY_PATH PS1
これで arm バイナリをビルドする環境が整いました。
長くなったので、x86環境などの続きはまた今度。
最近周りに iPhone を持つ人がちらほら出てきました。ガジェットとしては非常に気になるのですが、携帯として考えるとちょっと機能不足なので、「欲しい!」とは思いつつも「買いたい!」までの勢いはありません。
ちょっといじらせて貰うと、やっぱりブラウザによるHP閲覧とGoogleMapが光ります。3G回線使っていつでもどこでもWebブラウズできるのは魅力的ですね。
私はZaurus (SL-C1000)を持っており、bitWarp回線を契約しているので、重いながらも一応いつでもどこでもWebブラウズはできますが、純正ZaurusOS(Qt/E)ではGoogleMapが動かないんですよね。
前に pdaXrom の Firefox でも試してみましたが、確かスクロールが動かなかった気がします。
GoogleMapから地図データさえ取り出せればZaurusでも表示できそうだなぁと、GoogleMapの地図をダウンロードするツールを探していたら、そのものずばりを作っている人がいました。
JavaScriptを駆使してZaurusのOpera 7でもGoogleMapさながらの操作が可能になります。うーん。すごい。
でも、非力なZaurusでしかもブラウザ上のJavaScriptで組まれているため、ちょっと重いのが難点・・。あと、個人的には、指定の縮尺にない画像は、1つ2つ広域な画像を拡大して使ってほしいなぁ。地図画像のファイルサイズも馬鹿にできないので。
ということで拡大するバージョンを作ってみました。
画像がない場合を判定するために、img タグの onError ハンドラを使って実現しました。画像の読み込みに失敗すると、ハンドラが動いて1つ広域の画像を取得する・・・のですが、Opera 7 では動きませんでした (T-T)
Opera 7 には onError ハンドラがサポートされていないようでした。PCのFirefoxでは動いたのに・・・。
(ここまでが前振り。長っ!)
うー。ちょっとくやしいから、Qt/Eのネイティブアプリでつくってやる!
と、Web上で宣言することで、自分のモチベーションをあげてみることにしました。
Qt/E は example をコンパイルするくらいしかやったことありません。
C++はちょっと読めるけど、書けません。(CはOK)
まぁ、ヘタレなので途中で投げ出すかもしれませんが、勉強がてらやってみようかなと。
気長にね。
ぷちのいずをたれ流し始めてみました。
基本的にノンジャンルで自分のためのメモやひとりごとブログになると思います。
よろしくお願いします。