準天頂衛星アプリコンテストに参加するために,まずはAndroidアプリの
開発環境を準備してみました.
ちなみに,スマートフォンやタブレットに触れたことすらない初心者です.
スワイプって何?
ネットで探すと多くの入門記事があります.Eclipseをベースにした
Android Development Tools(ADT)と,新しいAndroid Studioがありますが,
ネットの情報が多いADTを選びました.
基本的に,こちらの記事の手順で開発環境をインストール.
ソフトウエアのバージョンは多少新しくなり,次の通りです.
Java SE Development Kit 7u55
ADT Bundle for Windows 20140321
準天頂アプリコンテストでは,プラットフォームにNexus 7 (2012)を指定しています.
そこで,Android SDK Managerの設定では,Android 4.2.2 (API 17)のSDK Platformと
Google API,ARM EABI v7a System Imageをインストールしました.
(クリックで拡大)
ここからは,こちらの記事を参考に,仮想デバイスを作成してエミュレータを起動.
Memory OptionsでRAMは512MB,VM Heapは64MBにしています.
(クリックで拡大)
さて,開発環境が整ったので,Androidに移植されたRTKLIBがビルドできるかなと思い立ち,
気軽に手を出したのですが,これが泥沼でした.
エミュレータで動かすまで,休日を丸一日費やしたので,備忘録として記事に残しておきます.
このRtkGpsは,RTKNAVIの機能をAndroidに移植したものです.一時,Google Playに登録
されていたのですが,今は削除されています.しかし,GitHubにソースコードが公開されて
いるので,まずはこれを入手します.
GitHub: illarionov/RtkGps
ここで注意が必要なのは,RtkGpsのリポジトリの一部が,他のプロジェクトのリポジトリを
参照しています.ここでDownload ZIPをクリックしてでソースコードをダウンロードすると,
この外部のリポジトリにリンクしているフォルダのコンテンツは空っぽです.そのため,
必ずcloneをしてください.
(クリックで拡大)
ちなみに,RTKLIBのフォルダはRTKLIBのリポジトリに,simonlynen_android_libsの
フォルダはLAPACKなどの移植版を含むandroid_libsにリンクしています.
RtkGpsのソースコードには.projectファイルがあり,このままEclipseにインポートできます.
AndroidManifest.xmlの中身を見てみると,targetSdkVersionが17となっており,すでに
インストールしたAndroid 4.2.2のプラットフォームで開発ができそうです.
ADTにプロジェクトをインポートすると,ビルドが自動的に始まります.
エラーも警告も出ないので,RunメニューからRun as Android Applicationを選んで,
エミュレータで実行してみます.
(クリックで拡大)
しかし,ここでエラー.RtkGpsが実行できません.LogCatを見ても,何のことやらさっぱり.
(クリックで拡大)
とりあえず,findLibrary returned nullを検索してみると,NDKやJNIといったキーワードが出てきます.
そういえば,RtkGpsのプロジェクトにjniというフォルダがあります.
さらにこれらを検索すると,どうやらCやC++で書かれたコードをAndroid上で実行するための仕組みのようです.
なるほど,そうやって移植するのか.
developer.android.com: Android NDK
そこで,Android NDKのサイトを頼りに,開発環境を追加.System and Software Requirementsを読むと,
Cygwinをインストールする必要があるようです.この時点でのCygwin DLLのバージョンは1.7.29です.
Android NDKのRequired development toolsであるmakeとawkのバージョンは以下の通り.
$ make --version
GNU Make 4.0
$ gawk --version
GNU Awk 4.1.1, API: 1.1 (GNU MPFR 3.1.2, GNU MP 6.0.0)
Cygwinのコンソールを立ち上げ,RtkGpsのプロジェクトフォルダでndk-buildを実行すると,
ライブラリのビルドが開始されます.
(クリックで拡大)
スムーズに行くかと思いきや,こちらもエラーに遭遇.
まず,いくつかの.hファイルの中身が,単に他のファイルへのパスになっています.
これでも書式としては問題ない気がしますが,とりあえず#includeに書き直します.
(クリックで拡大)
この変更が必要なのは,以下の6つのファイルです.
RtkGps/jni/simonlynen_android_libs/lapack/jni/clapack/SRC/blaswrap.h
RtkGps/jni/simonlynen_android_libs/lapack/jni/clapack/SRC/f2c.h
RtkGps/jni/simonlynen_android_libs/lapack/jni/clapack/INSTALL/blaswrap.h
RtkGps/jni/simonlynen_android_libs/lapack/jni/clapack/INSTALL/f2c.h
RtkGps/jni/simonlynen_android_libs/lapack/jni/clapack/BLAS/SRC/blaswrap.h
RtkGps/jni/simonlynen_android_libs/lapack/jni/clapack/BLAS/SRC/f2c.h
次に,ライブラリを生成する際,Argument list too longのエラーが発生します.
(クリックで拡大)
これも何かと調べてみると,どうやらコマンドラインの引数となるファイル名の数が
多すぎるようです.エラーを回避するために,Android.mkに以下のラインを追加します.
LOCAL_SHORT_COMMANDS := true
(クリックで拡大)
この変更が必要なファイルは,以下の2つです.
RtkGps/jni/simonlynen_android_libs/lapack/jni/clapack/SRC/Android.mk
RtkGps/jni/simonlynen_android_libs/lapack/jni/clapack/BLAS/SRC/Android.mk
さて,これで問題は解決するのですが,NDK/docs/ANDROID-MK.htmlに次のような
コメントがあります.
NOTE: We do not recommend enabling this feature by default, since it
makes the build slower.
この警告の通り,ビルドは見事なほどに遅くなります.1時間以上かかりますので,
のんびりと待ちましょう.
(クリックで拡大)
これで,RtkGpsに必要なライブラリも生成されました.
ADTに戻り,再度エミュレータにインストールすると,無事にRtkGpsが起動!
(クリックで拡大)
GPS受信機とはUSBやBluetoothで接続するのですが,エミュレータでそこまで
模擬できるのかは不明です.実機で試してみたい.
【追記】特にネットワークの設定をすることなく,エミュレータからntrip casterに
アクセスすることができました.エミュレータ,すごい.
(クリックで拡大)
開発環境を準備してみました.
ちなみに,スマートフォンやタブレットに触れたことすらない初心者です.
スワイプって何?
ネットで探すと多くの入門記事があります.Eclipseをベースにした
Android Development Tools(ADT)と,新しいAndroid Studioがありますが,
ネットの情報が多いADTを選びました.
基本的に,こちらの記事の手順で開発環境をインストール.
ソフトウエアのバージョンは多少新しくなり,次の通りです.
Java SE Development Kit 7u55
ADT Bundle for Windows 20140321
準天頂アプリコンテストでは,プラットフォームにNexus 7 (2012)を指定しています.
そこで,Android SDK Managerの設定では,Android 4.2.2 (API 17)のSDK Platformと
Google API,ARM EABI v7a System Imageをインストールしました.
![](https://blogimg.goo.ne.jp/user_image/39/e5/80d76d29c5932991e79b16092cfd416a.png)
ここからは,こちらの記事を参考に,仮想デバイスを作成してエミュレータを起動.
Memory OptionsでRAMは512MB,VM Heapは64MBにしています.
![](https://blogimg.goo.ne.jp/user_image/3a/5d/1f9c8d12c5617ba7c9ce55deb8d60b45.png)
さて,開発環境が整ったので,Androidに移植されたRTKLIBがビルドできるかなと思い立ち,
気軽に手を出したのですが,これが泥沼でした.
エミュレータで動かすまで,休日を丸一日費やしたので,備忘録として記事に残しておきます.
このRtkGpsは,RTKNAVIの機能をAndroidに移植したものです.一時,Google Playに登録
されていたのですが,今は削除されています.しかし,GitHubにソースコードが公開されて
いるので,まずはこれを入手します.
GitHub: illarionov/RtkGps
ここで注意が必要なのは,RtkGpsのリポジトリの一部が,他のプロジェクトのリポジトリを
参照しています.ここでDownload ZIPをクリックしてでソースコードをダウンロードすると,
この外部のリポジトリにリンクしているフォルダのコンテンツは空っぽです.そのため,
必ずcloneをしてください.
![](https://blogimg.goo.ne.jp/user_image/72/84/ec3de08896fa600aeb638a0d1ac739f7.png)
ちなみに,RTKLIBのフォルダはRTKLIBのリポジトリに,simonlynen_android_libsの
フォルダはLAPACKなどの移植版を含むandroid_libsにリンクしています.
RtkGpsのソースコードには.projectファイルがあり,このままEclipseにインポートできます.
AndroidManifest.xmlの中身を見てみると,targetSdkVersionが17となっており,すでに
インストールしたAndroid 4.2.2のプラットフォームで開発ができそうです.
ADTにプロジェクトをインポートすると,ビルドが自動的に始まります.
エラーも警告も出ないので,RunメニューからRun as Android Applicationを選んで,
エミュレータで実行してみます.
![](https://blogimg.goo.ne.jp/user_image/4e/37/607f17d51db41e70887f64c0e9693485.png)
しかし,ここでエラー.RtkGpsが実行できません.LogCatを見ても,何のことやらさっぱり.
![](https://blogimg.goo.ne.jp/user_image/04/35/bc7cac38e1431c72b3643e2e8d5bac56.png)
とりあえず,findLibrary returned nullを検索してみると,NDKやJNIといったキーワードが出てきます.
そういえば,RtkGpsのプロジェクトにjniというフォルダがあります.
さらにこれらを検索すると,どうやらCやC++で書かれたコードをAndroid上で実行するための仕組みのようです.
なるほど,そうやって移植するのか.
developer.android.com: Android NDK
そこで,Android NDKのサイトを頼りに,開発環境を追加.System and Software Requirementsを読むと,
Cygwinをインストールする必要があるようです.この時点でのCygwin DLLのバージョンは1.7.29です.
Android NDKのRequired development toolsであるmakeとawkのバージョンは以下の通り.
$ make --version
GNU Make 4.0
$ gawk --version
GNU Awk 4.1.1, API: 1.1 (GNU MPFR 3.1.2, GNU MP 6.0.0)
Cygwinのコンソールを立ち上げ,RtkGpsのプロジェクトフォルダでndk-buildを実行すると,
ライブラリのビルドが開始されます.
![](https://blogimg.goo.ne.jp/user_image/5e/63/29e56ef85180d8d377b6b38054b5c55a.png)
スムーズに行くかと思いきや,こちらもエラーに遭遇.
まず,いくつかの.hファイルの中身が,単に他のファイルへのパスになっています.
これでも書式としては問題ない気がしますが,とりあえず#includeに書き直します.
![](https://blogimg.goo.ne.jp/user_image/15/ac/98649a854f1fab6f97e1266c28ebab18.png)
この変更が必要なのは,以下の6つのファイルです.
RtkGps/jni/simonlynen_android_libs/lapack/jni/clapack/SRC/blaswrap.h
RtkGps/jni/simonlynen_android_libs/lapack/jni/clapack/SRC/f2c.h
RtkGps/jni/simonlynen_android_libs/lapack/jni/clapack/INSTALL/blaswrap.h
RtkGps/jni/simonlynen_android_libs/lapack/jni/clapack/INSTALL/f2c.h
RtkGps/jni/simonlynen_android_libs/lapack/jni/clapack/BLAS/SRC/blaswrap.h
RtkGps/jni/simonlynen_android_libs/lapack/jni/clapack/BLAS/SRC/f2c.h
次に,ライブラリを生成する際,Argument list too longのエラーが発生します.
![](https://blogimg.goo.ne.jp/user_image/7d/e9/e004a6a2fb2cdb066d80cd8b0437188f.png)
これも何かと調べてみると,どうやらコマンドラインの引数となるファイル名の数が
多すぎるようです.エラーを回避するために,Android.mkに以下のラインを追加します.
LOCAL_SHORT_COMMANDS := true
![](https://blogimg.goo.ne.jp/user_image/62/1b/806c254f6bad6fb8b796b68a4268581f.png)
この変更が必要なファイルは,以下の2つです.
RtkGps/jni/simonlynen_android_libs/lapack/jni/clapack/SRC/Android.mk
RtkGps/jni/simonlynen_android_libs/lapack/jni/clapack/BLAS/SRC/Android.mk
さて,これで問題は解決するのですが,NDK/docs/ANDROID-MK.htmlに次のような
コメントがあります.
NOTE: We do not recommend enabling this feature by default, since it
makes the build slower.
この警告の通り,ビルドは見事なほどに遅くなります.1時間以上かかりますので,
のんびりと待ちましょう.
![](https://blogimg.goo.ne.jp/user_image/7d/b6/962d59018477d706800881abc6810016.png)
これで,RtkGpsに必要なライブラリも生成されました.
ADTに戻り,再度エミュレータにインストールすると,無事にRtkGpsが起動!
![](https://blogimg.goo.ne.jp/user_image/07/d2/3df99b5eb54a8ded32080faeb4b34bcb.png)
GPS受信機とはUSBやBluetoothで接続するのですが,エミュレータでそこまで
模擬できるのかは不明です.実機で試してみたい.
【追記】特にネットワークの設定をすることなく,エミュレータからntrip casterに
アクセスすることができました.エミュレータ,すごい.
![](https://blogimg.goo.ne.jp/user_image/06/a5/45e7565e81fa5687084213dd3d0a04eb.png)
※コメント投稿者のブログIDはブログ作成者のみに通知されます