1. 程式人生 > >Android Skia程式設計系列(一):Hello Skia

Android Skia程式設計系列(一):Hello Skia

雖然在ndk文件中,google不推薦使用native C/C++來開發應用程式。但在實際開發中,可能不得不使用native C/C++的情況,比如跨平臺軟體開發。為手機開發軟體,為了能夠面向更廣泛的使用者群,免不了要同時開發symbian、windows mobile、android等主流手機平臺版本。出於效率的考慮,一般手機軟體採用C/C++開發,所以為了避免重起爐灶,在android下一般選擇使用native C/C++開發核心元件,再加上一個Java語言編寫的外殼。筆者最近移植一款應用到android,該應用採用了skia圖形庫,因此對android下的skia稍微進行了研究。在此係列文章中,我將分析一下android下的Skia程式設計。

還是以大名鼎鼎的hello world作為本文章的起點吧。我們知道,android採用skia作為其核心圖形引擎,因此android天然支援skia繪圖,問題在於Java層如何和jni層的程式碼相互訪問。其實android中有很多繪圖類(android.graphics包下的類)都是對skia c++類的一個封裝。比如Canvas <-> SkCanvas, Paint <-> SkPaint,關鍵是如何在它們之間架起一座橋樑。

首先看看java側的類定義:

 

SkiaView類繼承自View類,定義了一個native方法renderHello,注意其引數是Canvas。JNI側的程式碼如下:

 

在函式的開始,呼叫GraphicsJNI::getNativeCanvas方法處理java側傳遞過來的Canvas物件,獲取SkCanvas物件指標,有了SkCanvas,我們就可以在上面進行繪製了。

需要注意的是,ndk中並沒有包含skia相關標頭檔案和庫函式,因此要編譯此程式,還需要下載android原始碼並進行編譯。不過android系統中已經有這些庫檔案,所以部署到手機上執行是沒有問題的。Android.mk檔案如下:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

MY_ANDROID_SOURCE=$(HOME)/android/source/cupcake

LOCAL_MODULE := libSkiaDemo

LOCAL_CPP_EXTENSION := .cpp

LOCAL_CXXFLAGS :=

LOCAL_C_INCLUDES := $(MY_ANDROID_SOURCE)/frameworks/base/core/jni/android/graphics /

                                        $(MY_ANDROID_SOURCE)/external/skia/include/core /

                                        $(MY_ANDROID_SOURCE)/external/skia/include/images /

                                        $(MY_ANDROID_SOURCE)/frameworks/base/include /

                                        $(MY_ANDROID_SOURCE)/system/core/include

LOCAL_SRC_FILES := SkiaDemoJni.cpp

LOCAL_LDLIBS := -llog -lsgl -landroid_runtime /

                                -L$(MY_ANDROID_SOURCE)/out/target/product/generic/system/lib/

include $(BUILD_SHARED_LIBRARY)

完整的程式碼和Android.mk檔案可以使用如下命令獲取:

svn checkout http://androidcodes.googlecode.com/svn/trunk/ androidcodes

最終的執行結果如下圖所示:

Skia Demos截圖

注:android版本不同,skia版本也不太相同,介面有些細微的差別。