surface manager 可以準(zhǔn)備一塊 surface,把 surface 的 fd (一塊 ashmem 記憶體) 傳給一個(gè) app,讓 app 可以在上面作畫。有了這層理解,我們對 android 可以有更自由的發(fā)揮,例如,可以不改一行 cairo 的程式碼,就利用 cairo 與 c++ 寫出一個(gè)會動的時(shí)鐘
而 Surface manager 顧名思義,就是管理邏輯上眾多的 surface,其底層對應(yīng)於 OpenGL|ES 的實(shí)做。透過 surface 的處理,我們可讓像
fdclock 這樣原生 (native) 的 C 語言程式,透過同樣在 GNU/Linux 上原生的 Cairo 函式庫,無痛的顯示處理。這實(shí)在很吸引人,畢竟若能在 Android 平臺充分重用 GNU/Linux 既有的軟體功能,會是多麼有趣的事。且讓我們思考是否能在 Android 上撰寫 C 語言的 OpenGL/ES 應(yīng)用程式。
Android 已提供初步的 OpenGL/ES 封裝,實(shí)做則是透過 agl (Android OpenGL) 底層的 PixelFlinger 與 GPU。關(guān)於 Java 部份的 OpenGL APIs 操作,可參閱原始程式碼 frameworks/base/opengl/java/android/opengl/GLSurfaceView.java ,不過現(xiàn)在只看 C 程式的部份。動態(tài)連結(jié)函式庫必須連結(jié)到以下三者:
- libEGL : OpenGL/ES APIs
- libGLESv1_CM : Reference implementation
- libui : Android UI framework (native)
準(zhǔn)備好我們的程式碼之後,其建構(gòu)過程如下:
$ . build/envsetup.sh
$ cd angeles-test/
$ mm
make: Entering directory `/home/jserv/Myth/mydroid'
target arm C: angeles-test <= /home/jserv/Myth/mydroid/angeles-test/demo.c
...
參考的螢?zāi)伙@示如下:
不過,在模擬器顯示的狀況會比實(shí)體遜色頗多,可見到相當(dāng)嚴(yán)重的重繪動作,但基本上是可用的。