2008年12月30日火曜日

android dev phone1 で OpenGLES の Native アプリを動かす

疲れました。

昨日の夜から、睡眠時間をはさんで、ずっと android と格闘していました。まあ、コンパイルの待ち時間が多かったのですが、それでも疲れました。家で使っている椅子は首に悪い。何度も首が痛くなりました。

明日には帰省しないといけないこともあり、今年中に動いてよかったです。

さて、単純に Native アプリを動かすだけなら、結構いろんな人がまとめてくれています。

http://www.adamrocker.com/blog/191/c_native_executable_file_on_android.html

だいたいこの通りで実機上でも動きました。

dynamic_link の場合は少し面倒ですが、
> strace ./test_dynamic
のように、アプリを引数に実行させると、動的リンクのファイルがないとかメッセージをはいています。ちなみに、コンパイル時に指定する.soファイルは、実機から取得したものを使用したほうがいいです。
>adb pull ***.so
のように指定すれば取得できます。わざわざ、実機側のライブラリを変えたりする必要はありません。

これ以降、OpenGLES のハードウェアアクセラレーションに悩みました。というより、どこのサイトにも、アクセラレーション付きのライブラリが動いたと書かれていなくて、疑心暗鬼になっていました。

しかし、説明はほとんどないにもかかわらず、欲しかったサンプルアプリがおいてありました。

http://plausible.org/andy/Game1.tar.gz

Andy Ross さん、Thank you very much!

すばらしい。JNI を使って、OpenGLES のCコードを呼んでいます。Javaのインターフェースも付いているので、> adb install でインストールもできます。

ただ、色々と素人なので、これをコンパイルするまでに1晩費やしてしまいました、、、、

まず、公式サイトから android 用のtoolchainのソースコードをとってきて、コンパイルしました。何箇所かつまったりもしましたが、ちょっといじったりして、コンパイル通しました。Fedora10上です。

(toolchainはコンパイルしなくてもよいみたいです。ソースツリーのprebuild に入っているみたいでした、、、、)

次に、Game1 のMakefileなどでPath設定をいじってコンパイル完了です。

これで、なんとか動きました。そしてついに、QUALCOMM のドライバを確認しました。

I/Game1 ( 340): VENDOR: QUALCOMM, Inc.
I/Game1 ( 340): RENDERER: Q3Dimension MSM7500 01.02.08 0 4.0.0
I/Game1 ( 340): VERSION: OpenGL ES 1.0-CM
I/Game1 ( 340): EXTENSIONS: GL_ARB_texture_env_combine GL_ARB_texture_env_crossbar GL_ARB_texture_env_dot3 GL_ARB_texture_mirrored_repeat GL_ARB_vertex_buffer_object GL_ATI_extended_texture_coordinate_data_formats GL_ATI_imageon_misc GL_ATI_texture_compression_atitc GL_EXT_blend_equation_separate GL_EXT_blend_func_separate GL_EXT_blend_minmax GL_EXT_blend_subtract GL_EXT_stencil_wrap GL_OES_byte_coordinates GL_OES_compressed_paletted_texture GL_OES_draw_texture GL_OES_fixed_point GL_OES_matrix_palette GL_OES_point_size_array GL_OES_point_sprite GL_OES_read_format GL_OES_single_precision GL_OES_vertex_buffer_object GL_QUALCOMM_vertex_buffer_object GL_QUALCOMM_direct_texture
I/Game1 ( 340): RED_BITS: 5
I/Game1 ( 340): GREEN_BITS: 6
I/Game1 ( 340): BLUE_BITS: 5
I/Game1 ( 340): ALPHA_BITS: 0
I/Game1 ( 340): DEPTH_BITS: 16
I/Game1 ( 340): STENCIL_BITS: 0

ちなみに、起動時に表示されるログでは、こうなっています。

I/SurfaceFlinger( 56): OpenGL informations:
I/SurfaceFlinger( 56): vendor : Google Inc.
I/SurfaceFlinger( 56): renderer : Android PixelFlinger 1.0

libGLES_CM.so は Google製ソフトウェアラスタライザであって、libhgl.so がQUALCOMM製のドライバで、libGLES_CM.so から動的に読み込まれているみたいです。

まあ、ちっちゃい四角形が表示されてるだけですけど、それでも感動ものです。



続きは来年。

0 件のコメント: