// get ClassjmethodID constructor = (*env)->GetMethodID(env, cls, "", "()V");jobject testObject = (*env)->NewObject(env, testClass, constructor);methodID callFromCpp = (*env)->GetMethodID(env, testClass, "callFromCpp", "()V");
//get methodid(*env)->CallVoidMethod(env, testObject, callFromCpp);
那自己畫 UI 是否會更方便點?比如 JUCE 和 QT 就是自己畫的,我們來看看 QT 的效果:
看起來很不錯是吧?不過在 Android 5 下就悲劇了,很多效果都沒出來,比如按鈕沒有漣漪效果,甚至邊框都沒了,根本原因在于它是通過 Qt Quick Controls 的自定義樣式來模擬的,而不是使用系統(tǒng) UI 組件,因此它享受不到系統(tǒng)升級自動帶來的界面優(yōu)化,只能自己再實現(xiàn)一遍,工作量不小。
反而如果最開始用的是 Android 原生組件就什么都不需要做,而且還能用新的 AppCompat 庫來在 Android 5 以下實現(xiàn) Material Design 效果。
最后一種做法是使用 OpenGL 來繪制界面,因為 EGL OpenGL 本身就是跨平臺,所以基于它來實現(xiàn)會很方便,目前大多數(shù)跨平臺游戲底層都是這么做的。
既然可以基于 OpenGL 來開發(fā)跨平臺游戲,是否能用它來實現(xiàn)界面?當然是可行的,而且 Android 4 的界面就是基于 OpenGL 的,不過它并不是只用 OpenGL 的 API,那樣是不現(xiàn)實的,因為 OpenGL API 最初設計并不是為了畫 2D 圖形的,所以連畫個圓形都沒有直接的方法,因此 Android 4 中是通過 Skia 將路徑轉換為位置數(shù)組或紋理,然后再交給 OpenGL 渲染的。
然而要完全實現(xiàn)一遍 Android 的 UI 架構工作量不小,以下是其中部分相關代碼的代碼量:
其中光是文字渲染就非常復雜,如果你覺得簡單,那只能說明你沒看過這個世界有多大,或許你知道中文有編碼問題、英語有連字符(hyphen)折行,但你是否知道繁體中文有豎排版、阿拉伯文是從右到左的、日語有平假名注音(ルビ)、印度語有元音附標文字(abugida ????)……?
而相比之下如果每個平臺單獨開發(fā)界面,看似工作量不小,但目前在各個平臺下都會有良好的官方支持,相關工具和文檔都很完善,所以其實成本沒那么高,而且可以給用戶和系統(tǒng)風格保持一致的良好體驗,所以我認為對于大多數(shù)應用來說自己畫 UI 是很不劃算的。
不過也有特例,對于 UI 比較獨特的應用來說,自己畫也是有好處的,除了更靈活的控制,它還能使得不同平臺下風格統(tǒng)一,這在桌面應用中很常見,比如 Windows 下你會發(fā)現(xiàn)幾乎每個必備軟件的 UI 都不太一樣,而且好多都有換膚功能,在這種情況下很適合自己畫 UI。