2011年7月30日土曜日

[Android] Androidエミュレーターが起動しなくなった

How to solve a problem that Android-NDK dose not launch
android-sdk_r12-windowsをインストールしたらエミュレーターが起動しなくなりました。

エラーメッセージ
invalid command-line parameter: Files\android-sdk-windows\android-sdk_r12-windows\tools/emulator-arm.exe.
Hint: use '@foo' to launch a virtual device named 'foo'.
please use -help for more information

どうやらパスにスペースが含まれていることが原因のようです。
保存場所を
D:\Program Files\android-sdk-windows から
D:\android-sdk-windows に変更したら起動するようになりました。

android-sdk_r11-windowsまではパスにスペースが含まれていてもちゃんと動いたのでびっくりしました。
ちなみにAndroid-NDK(ndk-build)もパスにスペースがあるとコンパイルできませんでした。

以上、参考になれば幸いです。

2011年7月23日土曜日

[Windows7] メモリーを増設したら起動しなくなった (Kernel-power イベントID41)

Windows7 had been unstable since I added memory.

安くて有名だったサーバーHP ProLiant ML115 G5にWindows7-64bitをインストールしてパソコンとして使っているのですが、メモリー(RAMモジュール)を5GB(2GB×2 + 1GB)から8GB(2GB×4)に増やしたら起動が不安定になりました。
過去に故障のためメインボードを交換してます。
CPUはAthlon X2に交換済みです。

電源が切れた状態から起動(コールドスタート)すると
「ファイルを読み込んでいます」と表示した後に勝手に再起動し、修復セットアップを要求する(無視すると正常に起動する)
「このファイルのデジタル署名を検証できません」と表示される(再起動すると正常に起動する)
のどちらかの現象が起こります。
たまに正常に起動しますが復元ポイントに戻されます。再起動した場合はこの症状は起きません。
イベントビューアーをみるとKernel-power イベントID41が記録されています。

※この問題は
起動しなくなったHP ProLiant ML115 G5が直った
にて完全に解決しました。
以下の解決方法は2011年7月時点の内容ですのでご了承ください。

結論
BIOS設定の
Advanced
 - CPU Configuration
  - Memory Channel Mode を
Independent から Combined に変更したら解決しました。

しかもメモリーのWindowsエクスペリエンスインデックスが7.1から7.2に上がりました。
容量もこの通り8GB(8MB×1024)と認識されてます。

試してみたけど解決に至らなかったこと
  • 修復セットアップ
    →復元ポイントに戻されるだけ、Windows Updateが台無しです
  • CドライブをフォーマットしてOSをクリーンインストール
    →効果無し
  • ハードディスクのSATAケーブルを交換
    →変化無し
  • BIOSのPowerNow!をDisableに設定する
    →効果無し
  • グラフィックボードをRADEON HD5450(VRAM 512MB)からNVIDIA GeForce 8400GS(VRAM 256MB)に変更
    →効果無し、ただし発熱量が下がりました
  • MEMTEST86+でRAMの不良確認
    →異常なし
  • デバイスマネージャーのPCI標準PCI-to-PCIブリッジ デバイス13(オンボードのグラフィック機能)を無効にする
    →効果無し
  • システムエラーの「自動的に再起動する」の無効化
    →エラーが起きた後に再起動するかしないかの設定なので意味がない

気休め1・デバイス13の無効化

気休め2・システムエラーの「自動的に再起動する」の無効化

最近のWindowsは不具合が起きたらOSよりハードウェアを疑うべきです。
ただし今回の症状はハードウェアは正常で、しかもコールドスタートするとたまに発症する内容でなので対処方法がわかるまで時間がかかりました。

以上、参考になれば幸いです。

2011年7月16日土曜日

[Android] OpenGLで頂点の多いポリゴンを扱うには

How to draw many vertrics on GLSurfaceView

前回のブログobj2opengl.plをJava用に改造する では
obj2opengl: convert obj 3D models to arrays compatible with iPhone OpenGL ES « Heiko Behrens (Blog):
http://heikobehrens.net/2009/08/27/obj2opengl/
で公開されているバナナのオブジェクトは頂点が多くてJavaでは扱えないことがわかりました。

原因は
定数プールは65536エントリー以内
コンストラクターやメソッドのソースは65536バイト以内
というJavaの仕様によるものでした。

Javaは大きいソースをビルドできないので、外部ファイルに持たせる方法をいくつか試してみましたがどれも無理でした。

1.assetsフォルダーに頂点データをテキストファイルに保存する
→AssetManagerは256行以上のテキストファイルを読み込めない(IOException例外が発生)

2.頂点データをvalues/strings.xmlに保存する
→strings.xmlは65536行以上のデータを扱えない

試行錯誤の結果、obj2opengl.plが出力したbanana.hをAndroid-NDKで使うことでバナナを表示できました
HBehrens-obj2opengl-a0f123e.zipに含まれるbanana.jpgとbanana.hをAndroidプロジェクトに取り込みます。
jniフォルダーを作ってbanana.hを保存します。
drawableフォルダーを作ってbanana.jpgを保存します。
jniフォルダーにはさらにAndroid.mkとbanan.cppを保存します。

Android.mk
banana.cpp
Activityのソースです。
Main.java(Activity) これでカレントフォルダーをプロジェクトのjniフォルダーに移動し、ndk-buildを実行します。

起動するとこうなります。
画面をドラッグすると視点が動くようにしました。
バナナとバナナの中心点がかなり離れてるようで(気のせいでした)、大きく動かすと画面から消えてしまいます。

今回は頂点の配列をAndroid-NDK、それ以外をJavaで書いたのでエミュレーターで実行するとすごく遅いです
FloatBufferの作成にすごく時間がかかります。バナナが表示されるまで2分くらいかかりました。
FloatBufferをシリアライズできればもっとスマートになるんですが。

Blenderモンキーの頂点+法線ベクトルの組み合わせもソースが大きくてJavaではビルドできませんでした。objファイルをobj2opengl.plでhファイルに変換し、バナナと同じようにAndroid-NDKでビルドしました。光源で照らしてます。こちらはテクスチャがないのでエミュレーターに表示されるまで30秒くらいでした。

Android-NDKを使うデメリットはARMプラットフォームの端末しかサポートきなくなることです。x86版Android端末にはインストールすらできなくなります。
ただし、今のところ国内のAndroid端末はほとんどがARMベース(Qualcomm、Tegraなど)なので大きなデメリットではないと思います。

以上、参考になれば幸いです。

2011年7月9日土曜日

[Blender] obj2opengl.plをJava用に改造する

Blender object to OpenGL for Android Java

3DCG作成ツール「Blender」のobjファイルをC言語のhファイルに変換するperlスクリプト「obj2opengl.pl」を使ってみました。
obj2opengl: convert obj 3D models to arrays compatible with iPhone OpenGL ES « Heiko Behrens (Blog): http://heikobehrens.net/2009/08/27/obj2opengl/
からHBehrens-obj2opengl-a0f123e.zipをダウンロードしました。

BlenderのデータをAndroidでも使いたいのでobj2opengl.plをobjファイルをjavaファイルに変換するように改造してみました。

改造した内容は次の通りです。
・float型の数値にサフィックスfをつける
・クラス名・変数名が数字で始まる場合は先頭に「_」をつける
・unsigned intをintに変更
・クラス名・ファイル名の最初の文字が小文字なら大文字に変換する
・パッケージのステートメント追加
・FloatBuffer宣言の追加

ソースです。
obj2opengl4java.pl
obj2opengl4java.pl の使い方
obj2opengl4java.plはコマンドプロンプト(コンソール)で操作します。
変換したいオブジェクトファイルはHBehrens-obj2opengl-a0f123e.zipに含まれているcube.objとします。
obj2opengl4java.plとオブジェクトファイル(cube.obj)を同じフォルダーに保存します。
カレントフォルダーはファイルを保存したフォルダーとします。

WindowsならActivePerlなどをインストールしperl.exeのPath設定してコマンドプロンプトから
perl obj2opengl4java.pl cube.obj
と入力します。

CygwinやLinuxなら
./obj2opengl4java.pl cube.obj
と入力します。

成功するとCube.javaが作られます。
Cube.javaをAndroidプロジェクトにインポートし、パッケージ名を適切に修正してください。
Cube.java(コメント行は省略)

Activityのソースです。
Main.java

このソースを実行するとこうなります。

Blenderで作った球体を回転させるサンプルも作ったらこんな感じになりました。(ソースは省略)
※ただの円に見えますが球です。

Javaにまつわる難点
BlenderのオブジェクトファイルをJavaソースに変換する上で大きな問題があります。
Javaの仕様により定数プールは65536エントリー以内と決められています。
コンストラクターやメソッドは65536バイト以内でなければいけません。
たとえばHBehrens-obj2opengl-a0f123e.zipに含まれるbanana.objは頂点の多いのでJavaソースに変換してもビルドできません。
定数プールが65536エントリーを超えています

頂点の多いポリゴンはAndroidで扱えないのでしょうか?
答えは「いいえ」です。その方法は・・・次回に続く。(7月16日予定)


以上、参考になれば幸いです。

2011年7月2日土曜日

シャープAndroidアプリ開発テクニカルセッション (2011年夏)

SHARP Android applications developers technical session (2011 summer)
Androidアプリ開発テクニカルセッションに参加してきました。

docomo AQUOS PHONE SH-12C
au AQUOS PHONE IS11SH
au AQUOS PHONE IS12SH
SoftBank AQUOS PHONE 006SH
SoftBank AQUOS PHONE 007SH
の各機種でOpenGLとAndroid-NDKを動作したところ従来の機種と同じように動作しました。
DalvikVMのJITコンパイラのおかげでより速く動くと期待してましたが、OpenGLのFPSはLYNX3D SH-03C(Android2.1)と変わりませんでした。

Wi-Fi sync Screeniida INFOBAR A01と上記の全機種で正常に動作しました。
AirStation再起動問題が起きたらWi-Fi sync Screenをご利用ください。
持参したOpenGLとAndroid-NDKのサンプルがjp.co.sharp.android.stereo3dlcdのライブラリーを参照していたため、3D非対応のA01は少ししか試せませんでした。

全機種ともホームアプリはLYNX3Dに比べてなめらかでサクサク動いてました。指の動きをしっかり追随します。
YouTubeの3Dコンテンツも楽しいです。

以上、参考になれば幸いです。