AndroidのServiceのこと。
サービスってメインスレッドで実行されてるんですね
勝手に別スレッドでやってると思ってた・・・。
サービスのスレッド作ってそこで処理走る訳じゃないよ、
ANRのリスクを減らしたいなら別スレッドを自分で用意してねと書いてあった・・
2013年3月26日火曜日
2013年1月31日木曜日
cocos2dxのBox2Dプロジェクト
cocos2d-xのBox2Dプロジェクトを
Android用にビルドするときにはまったメモ。
以下、太線部分を追加します。
・HelloWorldScene.hを書き換える
#include "Box2D/Box2D.h"
・Android.mkを書き換える
15行目付近
LOCAL_WHOLE_STATIC_LIBRARIES := cocos2dx_static cocosdenshion_static cocos_extension_static box2d_static
19行目付近
$(call import-module,CocosDenshion/android) \
$(call import-module,cocos2dx) \
$(call import-module,extensions) \
$(call import-module,external/Box2D)
以上です!
Android用にビルドするときにはまったメモ。
以下、太線部分を追加します。
・HelloWorldScene.hを書き換える
#include "Box2D/Box2D.h"
・Android.mkを書き換える
15行目付近
LOCAL_WHOLE_STATIC_LIBRARIES := cocos2dx_static cocosdenshion_static cocos_extension_static box2d_static
19行目付近
$(call import-module,CocosDenshion/android) \
$(call import-module,cocos2dx) \
$(call import-module,extensions) \
$(call import-module,external/Box2D)
以上です!
cocos2d-x Eclipseで編集&実行
XCode環境でcppファイルを編集して、Androidで動作確認する時には
build_native.shを叩いてビルドして実行。
・・のような手法が主流?のようですが
Eclipseでcppファイルを編集&ビルド&実行する方法も調べてみました。
http://kayosystem.blogspot.jp/2012/11/macandroidcocos2d-x_14.html
こちらを参考にしました。
EclipseでC/C++環境を作るところ等々は割愛します。
自分がハマったところだけメモ。
・NDK_ROOTが見つからない場合
CDTのBuild Consoleに
「NDK_ROOTがないよ」みたいなことでビルドが出来ない場合、
proj.android/build_native.shに
NDK_ROOTを宣言すると良さそうです。
私は、.bash_profileにNDK_ROOTを設定していましたが
(・・設定しているはずですが(自信無し))
上記のようなエラーでビルドが通りませんでした。
ついでに、environment.plistも設定してみたのですが
それでもうまく行きませんでした・・。
設定の仕方が悪かっただけでしょうか。謎。
build_native.shの32行目付近に
(最初にNDK_ROOTという変数が出てくる前に)
NDK_ROOT="ndkのパス"
を追加したところ、ビルドが通るようになりました。
・icon.pngでエラー
無事にビルドが通り、いざRunしようとすると
プロジェクトにエラーがあるぞと言われました。
drawable-hdpi/icon.pngに×マークが出ます。
なぜ・・。
最初は、アイコンサイズが80x80になっているから??
と思い、Resources/Icon-72.pngを72x72にリサイズしてみましたが
(というか名前に72とついてるのに何故80なのか)
エラーは相変わらず。
何故! と思い、エラーが出ている状態で続けて
Run As - Android Application を押してみた所
今度はエラーが消え、実行することができました・・。
今の所、2回に1回、実行できる感じです。
不便・・。
どこにもこのような情報が無いと思われるので
私の所だけで起きているのかもしれません。
解決できるといいな・・。
それ以外は、無事にEclipseでcppを編集&実行できました。
build_native.shを叩いてビルドして実行。
・・のような手法が主流?のようですが
Eclipseでcppファイルを編集&ビルド&実行する方法も調べてみました。
http://kayosystem.blogspot.jp/2012/11/macandroidcocos2d-x_14.html
こちらを参考にしました。
EclipseでC/C++環境を作るところ等々は割愛します。
自分がハマったところだけメモ。
・NDK_ROOTが見つからない場合
CDTのBuild Consoleに
「NDK_ROOTがないよ」みたいなことでビルドが出来ない場合、
proj.android/build_native.shに
NDK_ROOTを宣言すると良さそうです。
私は、.bash_profileにNDK_ROOTを設定していましたが
(・・設定しているはずですが(自信無し))
上記のようなエラーでビルドが通りませんでした。
ついでに、environment.plistも設定してみたのですが
それでもうまく行きませんでした・・。
設定の仕方が悪かっただけでしょうか。謎。
build_native.shの32行目付近に
(最初にNDK_ROOTという変数が出てくる前に)
NDK_ROOT="ndkのパス"
を追加したところ、ビルドが通るようになりました。
・icon.pngでエラー
無事にビルドが通り、いざRunしようとすると
プロジェクトにエラーがあるぞと言われました。
drawable-hdpi/icon.pngに×マークが出ます。
なぜ・・。
最初は、アイコンサイズが80x80になっているから??
と思い、Resources/Icon-72.pngを72x72にリサイズしてみましたが
(というか名前に72とついてるのに何故80なのか)
エラーは相変わらず。
何故! と思い、エラーが出ている状態で続けて
Run As - Android Application を押してみた所
今度はエラーが消え、実行することができました・・。
今の所、2回に1回、実行できる感じです。
不便・・。
どこにもこのような情報が無いと思われるので
私の所だけで起きているのかもしれません。
解決できるといいな・・。
それ以外は、無事にEclipseでcppを編集&実行できました。
2013年1月30日水曜日
cocos2d-xをAndroidでも動かす
目標:cocos2dxのプロジェクトがAndroidでも動くようにする。
動作確認した環境
Eclipse:Indigo
XCode:4.3.2
AndroidNDK:r8d
Cocos2d-x:cocos2d-2.0-x-2.0.4
ADT:21.0.0.
・環境構築…省略
http://mdlab.jp/project/framework/01.html
こちらを参考にしました。
AndroidNDKのパスを通すところまでやっておく。
…そこまで色々あった気もしますが、思い出したら追記します。
・Android用のcocos2dxプロジェクトを作成する
create-android-project.shを実行する。
targetIDは7とかにしました。お好みで。
プロジェクト名は、XCodeで作成するプロジェクトと同一になるように意識。
出来上がったプロジェクト名のフォルダを、一旦退避。
(この後XCodeで同じ階層に、同じ名前のフォルダを作成することになるため)
フォルダ名をリネームで良いでしょう。(プロジェクト名_androidとか)
・XCodeでcocos2dxプロジェクトを作成する
ProductNameとAndroid用のプロジェクト名が同じになるように作成。
作成先のディレクトリはcocos2dxの直下にしました。
(どこでもよいと思います)
これで、Android用とXCode用のプロジェクトが揃いました。
・XCodeの方にAndroidのプロジェクトをマージ
XCodeで作成したプロジェクト内の以下の場所に、
Androidで作成したプロジェクトに入っているproj.androidをまるっとコピーします。
例)プロジェクト名がSample01の場合
Sample01/Sample01/Classes
Sample01/Sample01/...
Sample01/Sample01/proj.android
こんな感じの構成になるように。
・build_native.shを編集
テキストエディタなどで、proj.android/build_native.shを編集します。
40行目付近
COCOS2DX_ROOT="$DIR/../../../"
(Android用プロジェクトと比べて、cocos2dxまでの階層が1つ深くなったので)
私はプロジェクトをcocos2dx直下に作ったので
上記のように「/..」を1つ増やす感じでしたが
任意の場所に作られている場合は、
ここは絶対パスで指定する必要がありますね。
・build_native.shを実行
実行します。
たくさんのファイルがコンパイルされていくはずです。
そういえば、先ほど作成したAndroid用のプロジェクトフォルダはもう使用しません。
proj.androidフォルダは、XCode用のプロジェクトの方へ統合してしまいましたので。
リネームしていたフォルダは、削除しました。
・XCodeで実行してみる
問題なく実行できることを確認します。
・Eclipseで実行してみる
プロジェクトをインポートします。
インポート後は、エラーが発生するかもしれません。
私の場合、libcocos2dxの参照先がおかしいため、エラーとなりました。
プロジェクトのプロパティを開き、Android-Libraryで
cocos2dxライブラリへの参照先を修正します。
(追記)
Android-Libraryでcocos2dxのライブラリを参照する格好にしていましたが、
cocos2d-2.0-x-2.0.4/cocos2dx/platform/android/java/src
の中身を、
Android用プロジェクト/proj.android/src
の中にコピーする方が良さそうです。
(理由…Androidのバックキーを制御したい時、
Cocos2dxGLSurfaceViewを編集する必要がありそうだから…)
これでEclipse上から、Android端末で実行できるはずです。
以上です。
動作確認した環境
Eclipse:Indigo
XCode:4.3.2
AndroidNDK:r8d
Cocos2d-x:cocos2d-2.0-x-2.0.4
ADT:21.0.0.
・環境構築…省略
http://mdlab.jp/project/framework/01.html
こちらを参考にしました。
AndroidNDKのパスを通すところまでやっておく。
…そこまで色々あった気もしますが、思い出したら追記します。
・Android用のcocos2dxプロジェクトを作成する
create-android-project.shを実行する。
targetIDは7とかにしました。お好みで。
プロジェクト名は、XCodeで作成するプロジェクトと同一になるように意識。
出来上がったプロジェクト名のフォルダを、一旦退避。
(この後XCodeで同じ階層に、同じ名前のフォルダを作成することになるため)
フォルダ名をリネームで良いでしょう。(プロジェクト名_androidとか)
・XCodeでcocos2dxプロジェクトを作成する
ProductNameとAndroid用のプロジェクト名が同じになるように作成。
作成先のディレクトリはcocos2dxの直下にしました。
(どこでもよいと思います)
これで、Android用とXCode用のプロジェクトが揃いました。
・XCodeの方にAndroidのプロジェクトをマージ
XCodeで作成したプロジェクト内の以下の場所に、
Androidで作成したプロジェクトに入っているproj.androidをまるっとコピーします。
例)プロジェクト名がSample01の場合
Sample01/Sample01/Classes
Sample01/Sample01/...
Sample01/Sample01/proj.android
こんな感じの構成になるように。
・build_native.shを編集
テキストエディタなどで、proj.android/build_native.shを編集します。
40行目付近
COCOS2DX_ROOT="$DIR/../../../"
(Android用プロジェクトと比べて、cocos2dxまでの階層が1つ深くなったので)
私はプロジェクトをcocos2dx直下に作ったので
上記のように「/..」を1つ増やす感じでしたが
任意の場所に作られている場合は、
ここは絶対パスで指定する必要がありますね。
・build_native.shを実行
実行します。
たくさんのファイルがコンパイルされていくはずです。
そういえば、先ほど作成したAndroid用のプロジェクトフォルダはもう使用しません。
proj.androidフォルダは、XCode用のプロジェクトの方へ統合してしまいましたので。
リネームしていたフォルダは、削除しました。
・XCodeで実行してみる
問題なく実行できることを確認します。
・Eclipseで実行してみる
プロジェクトをインポートします。
インポート後は、エラーが発生するかもしれません。
私の場合、libcocos2dxの参照先がおかしいため、エラーとなりました。
プロジェクトのプロパティを開き、Android-Libraryで
cocos2dxライブラリへの参照先を修正します。
(追記)
Android-Libraryでcocos2dxのライブラリを参照する格好にしていましたが、
cocos2d-2.0-x-2.0.4/cocos2dx/platform/android/java/src
の中身を、
Android用プロジェクト/proj.android/src
の中にコピーする方が良さそうです。
(理由…Androidのバックキーを制御したい時、
Cocos2dxGLSurfaceViewを編集する必要がありそうだから…)
これでEclipse上から、Android端末で実行できるはずです。
以上です。
2012年9月2日日曜日
AndroidでGPSとGoogle Map
AndroidでGPSとGoogle Maps Android APIを使ってみてます。
気になったところだけメモ。
・位置情報を一定時間ごとに計測する方法を悩み中
GPS…というか位置計測のやり方は、たくさん資料がありましたが
例えば1分に1回計測する、といった方法は、いまいち見つけられず。
requestLocationUpdates()の第二引数にmsecで秒数を指定すると
それ毎に送られてくるよ、という記事も見かけましたが
私が試した限りでは、第二引数の値にかかわらず
いつでも約1秒 に1回
LocationListenerのonLocationChanged()でlocationが取れました。
むむー
ひとまず、onLocationChangedで取れたものを溜め込んでおいて、
それをいかに使うか、という設計・・?
あるいは、必要なタイミングでrequestLocationUpdatesして、
locationが取れたらすぐremoveUpdateするような方がよいのか・・??
1分に一度とか、10分に一度のような
あまり頻繁に必要としない場合は、後者の方がよさそうな気がしています・・
まだまだ謎であります。
・getBestProvider()
GPSを優先的に使いたかったのですが、
getBestProviderしたら、NETWORK_PROVIDERをオススメされました。
まじめにCriteriaを指定(速度いらない、方位いらない、高度いらない…など)
してみても、しなくても、
いつも NETWORKの方をオススメされます。
結局、isProviderEnabledでGPSが使えるなら使うように、
自前でチェックすることにしました。
・GalaxyS2でonLocationChangedが呼ばれなくて涙目
別のGPSアプリを動かしたら、
自分のアプリの方にも反応が返ってくるようになったのですが。。
当初、位置情報設定でGPSもONにしてるし、ネットワークの方もONにしているのに
なぜかonLocationChangedに入ってこなくて
ずっともやもやしていました
まったく同じソースコードで、同じ設定で
別の端末(4.0のPROGRESSO)で試したら
ちゃんとonLocationChangedに入ってくる・・!
そこで、GPS Testというアプリを動かしてみた後に
自分のを実行してみたら、なんだか動いてる・・という流れでした。
とても謎でした。。
このGPS Testで行っていることを知りたい!
私に足りないヒントがありそうです
・ActivityとServiceの連携・・AIDL
「ActivityにGoogleMapのMapViewを表示し、そこに位置情報を反映させる」
というものを作ってみておりまして
位置情報の取得には、Serviceを使ってみました。
Activityは、MapActivityを継承
Serviceには、LocationListenerを実装
さらに、AIDLを2つ用意しました
ServiceからActivityに位置情報を通知するためのinterface
通知先をServiceに登録するためのinterface
・・初めてのAIDLで頭こんがらがりました。
・Google Maps Android APIを使う
もしかしたら、ものすごく、簡単なことだったかもしれないのですけど
自分はえらくはまったのでメモしておきます。。
私の環境は、EclipseのIndigo、MacでMountain Lionです。
Preference - Android - Build - Default debug keystore
ターミナルでコマンド打って、MD5の値を取得する
keytool -list -keystore (上記のディレクトリ)
・・文字化けがものすごいことになってたのですが、
ターミナルのエンコードの設定ですかね・・。
大事なところ (MD5) は化けてないので、ひとまず良しとします
https://developers.google.com/android/maps-api-signup?hl=ja
My certificate's MD5 fingerprint:
のところに、 大事な (MD5) の値をコピペして、Generate API Keyします
・・遷移したページでも、文字化けてたので、うひーという感じですが
大事なところは化けてないので以下略。
私の場合はレイアウトをxmlで用意したので
com.google.android.maps.mapview・・・をレイアウトのxmlに貼りました。
プロジェクトのProperties - Android - Google APIsの適切なものを選択。
Manifestファイルに、
uses-permissionに、permission.INTERNET
uses-libraryに、com.google.android.maps
を追加
これで動いたはず・・!
気になったところだけメモ。
・位置情報を一定時間ごとに計測する方法を悩み中
GPS…というか位置計測のやり方は、たくさん資料がありましたが
例えば1分に1回計測する、といった方法は、いまいち見つけられず。
requestLocationUpdates()の第二引数にmsecで秒数を指定すると
それ毎に送られてくるよ、という記事も見かけましたが
私が試した限りでは、第二引数の値にかかわらず
いつでも約1秒 に1回
LocationListenerのonLocationChanged()でlocationが取れました。
むむー
ひとまず、onLocationChangedで取れたものを溜め込んでおいて、
それをいかに使うか、という設計・・?
あるいは、必要なタイミングでrequestLocationUpdatesして、
locationが取れたらすぐremoveUpdateするような方がよいのか・・??
1分に一度とか、10分に一度のような
あまり頻繁に必要としない場合は、後者の方がよさそうな気がしています・・
まだまだ謎であります。
・getBestProvider()
GPSを優先的に使いたかったのですが、
getBestProviderしたら、NETWORK_PROVIDERをオススメされました。
まじめにCriteriaを指定(速度いらない、方位いらない、高度いらない…など)
してみても、しなくても、
いつも NETWORKの方をオススメされます。
結局、isProviderEnabledでGPSが使えるなら使うように、
自前でチェックすることにしました。
・GalaxyS2でonLocationChangedが呼ばれなくて涙目
別のGPSアプリを動かしたら、
自分のアプリの方にも反応が返ってくるようになったのですが。。
当初、位置情報設定でGPSもONにしてるし、ネットワークの方もONにしているのに
なぜかonLocationChangedに入ってこなくて
ずっともやもやしていました
まったく同じソースコードで、同じ設定で
別の端末(4.0のPROGRESSO)で試したら
ちゃんとonLocationChangedに入ってくる・・!
そこで、GPS Testというアプリを動かしてみた後に
自分のを実行してみたら、なんだか動いてる・・という流れでした。
とても謎でした。。
このGPS Testで行っていることを知りたい!
私に足りないヒントがありそうです
・ActivityとServiceの連携・・AIDL
「ActivityにGoogleMapのMapViewを表示し、そこに位置情報を反映させる」
というものを作ってみておりまして
位置情報の取得には、Serviceを使ってみました。
Activityは、MapActivityを継承
Serviceには、LocationListenerを実装
さらに、AIDLを2つ用意しました
ServiceからActivityに位置情報を通知するためのinterface
通知先をServiceに登録するためのinterface
・・初めてのAIDLで頭こんがらがりました。
・Google Maps Android APIを使う
もしかしたら、ものすごく、簡単なことだったかもしれないのですけど
自分はえらくはまったのでメモしておきます。。
私の環境は、EclipseのIndigo、MacでMountain Lionです。
Preference - Android - Build - Default debug keystore
ターミナルでコマンド打って、MD5の値を取得する
keytool -list -keystore (上記のディレクトリ)
・・文字化けがものすごいことになってたのですが、
ターミナルのエンコードの設定ですかね・・。
大事なところ (MD5) は化けてないので、ひとまず良しとします
https://developers.google.com/android/maps-api-signup?hl=ja
My certificate's MD5 fingerprint:
のところに、 大事な (MD5) の値をコピペして、Generate API Keyします
・・遷移したページでも、文字化けてたので、うひーという感じですが
大事なところは化けてないので以下略。
私の場合はレイアウトをxmlで用意したので
com.google.android.maps.mapview・・・をレイアウトのxmlに貼りました。
プロジェクトのProperties - Android - Google APIsの適切なものを選択。
Manifestファイルに、
uses-permissionに、permission.INTERNET
uses-libraryに、com.google.android.maps
を追加
これで動いたはず・・!
2012年6月30日土曜日
XCode4でUnitTest
導入の方法については、図解詳細付きで説明していらっしゃる方のページを参考にしました。
さてテストを書こう!という段階で詰まった時のメモを残します。
○テストケースを実行するメソッド名は「test~」
冷静に考えれば当たり前かもですが。。
最初、testで始まらない名前のメソッド名で、テストケース書いて実行していて
「何で実行されない??」
しばらく悩みました。。
名前がtest~で始まらない、tearDownとかでもないメソッドは、テスト対象にならないのですね。
○NSLogはちょっと隠されたところに出ている
実行されてるはずなのに、いつものウィンドウにログが出てこない…!!
と思っていたら、出てました。いつもとは違う場所に。
海外サイトですが、図解付きで大変助かりました。
http://agilewarrior.wordpress.com/2012/02/28/where-is-nslog-output-for-ocunit-tests/
吹き出しのアイコン、初めて押しました…!
ログを見たくて毎回辿るのですが、ちょっと面倒です。。
(つぶやき)
テスト実行したくないメソッドは、どうすればよいのでしょう。
メソッド名変えればよいんですかね…
さてテストを書こう!という段階で詰まった時のメモを残します。
○テストケースを実行するメソッド名は「test~」
冷静に考えれば当たり前かもですが。。
最初、testで始まらない名前のメソッド名で、テストケース書いて実行していて
「何で実行されない??」
しばらく悩みました。。
名前がtest~で始まらない、tearDownとかでもないメソッドは、テスト対象にならないのですね。
○NSLogはちょっと隠されたところに出ている
実行されてるはずなのに、いつものウィンドウにログが出てこない…!!
と思っていたら、出てました。いつもとは違う場所に。
海外サイトですが、図解付きで大変助かりました。
http://agilewarrior.wordpress.com/2012/02/28/where-is-nslog-output-for-ocunit-tests/
吹き出しのアイコン、初めて押しました…!
ログを見たくて毎回辿るのですが、ちょっと面倒です。。
(つぶやき)
テスト実行したくないメソッドは、どうすればよいのでしょう。
メソッド名変えればよいんですかね…
2012年3月2日金曜日
DirectX GetBackBuffer
DirectX9です
バックバッファの絵をテクスチャに貼ろうとしています。
フルスクリーン化した時のみ、
GetBackBuffer()でバックバッファを取ると
Pitchがなぜか少しだけ多くなります。
(フルスクリーンではない時は、問題ありません)
device->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &src);
src->GetDesc(&desc);
src->LockRect( &rSrc, &srcRect, 0);
rSrc.Pitchは、desc.Width*4バイトになってくれるはず・・なのですが
自分の場合は、フルスクリーン時のみ、
desc.Width*4 + 96バイトになっています。
うーん・・なぜでしょう
256で割り切れる数に合わせたいとか、何かあるんでしょうか。。
調べてみないとなぁ・・
バックバッファの絵をテクスチャに貼ろうとしています。
フルスクリーン化した時のみ、
GetBackBuffer()でバックバッファを取ると
Pitchがなぜか少しだけ多くなります。
(フルスクリーンではない時は、問題ありません)
device->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &src);
src->GetDesc(&desc);
src->LockRect( &rSrc, &srcRect, 0);
rSrc.Pitchは、desc.Width*4バイトになってくれるはず・・なのですが
自分の場合は、フルスクリーン時のみ、
desc.Width*4 + 96バイトになっています。
うーん・・なぜでしょう
256で割り切れる数に合わせたいとか、何かあるんでしょうか。。
調べてみないとなぁ・・
登録:
投稿 (Atom)