1. 程式人生 > 其它 >Qt安卓開發經驗011-020

Qt安卓開發經驗011-020

  1. 安卓中一個介面窗體對應一個Activity,多個介面就有多個Activity,而在Qt安卓程式中,Qt這邊只有一個Activity那就是QtActivity(包名全路徑 org.qtproject.qt5.android.bindings.QtActivity),這個QtActivity是固定的寫好的,整個Qt程式都是在這個QtActivity介面中。你開啟AndroidManifest.xml檔案可以看到對應節點有個name=org.qtproject.qt5.android.bindings.QtActivity,所以如果要讓Qt程式能夠更方便通暢的與對應的java類進行互動(需要上下文傳遞Activity的,比如震動,訊息提示等),建議新建一個java類,繼承自QtActivity即可,這樣相當於預設Qt啟動的就是你java類中定義的Activity,可以很好的控制和互動。

  2. 由於AndroidManifest.xml檔案每個程式都可能不一樣,為了做成通用的元件,這就要求可能不能帶上AndroidManifest.xml檔案,這樣的話每個Qt安卓程式都啟動預設內建的Activity,如果依賴Activity上下文的執行函式需要傳入Qt的Activity才行,這裡切記Qt的Activity包名是 Lorg/qtproject/qt5/android/bindings/QtActivity; 之前順手想當然的寫的 Landroid/app/Activity; 發現死活不行,原來是包名錯了。

  3. 一個Qt安卓程式中可以有多個Java類,包括繼承自Activity的類(這樣的Activity可以通過QtAndroid::startActivity函式來呼叫),但是隻能有一個通過AndroidManifest.xml檔案指定的Activity,不指定會預設一個。如果java類中不需要拿到Qt的Activity進行處理的,可以不需要繼承任何Activity,比如全部是運算的靜態函式。

  4. 在java類中如果上面沒有主動引入包名,則下面需要寫全路徑,引入了則不需要全路徑可以直接用(包括列舉值都可以直接寫,比如 VIBRATOR_SERVICE 這種列舉值引入了包名後不需要寫android.content.Context.VIBRATOR_SERVICE),建議引入包名,比如上面寫了 import org.qtproject.qt5.android.bindings.QtActivity; 則下面繼承類可以直接寫 public class QtAndroidActivity extends QtActivity,如果沒有引入則需要寫成 public class QtAndroidActivity extends org.qtproject.qt5.android.bindings.QtActivity 。

  5. 建議搭配 android studio 工具開發,因為在 android studio 中寫程式碼都有自動語法提示,包名會提示自動引入,可以檢視有那些函式方法等,還可以校驗程式碼是否正確,而如果在QtCreator中手寫有時候可能會寫錯,尤其是某個字母寫錯,當然這種錯誤是編譯通不過的,會提示錯誤在哪行。

  6. 用Qt做安卓開發最大難點兩個,第一個就是傳引數這些奇奇怪怪的字元(Ljava/lang/String;)啥意思,如何對應,這也不是Qt故意為難初學者啥的,因為這套定義機制是安卓系統底層要求的,系統層面定義的一套規範,其實這個在幫助文件中寫的很清楚,都有資料型別對照表,用熟悉了幾次就很簡單了。第二個難點就是用java寫對應的類,如果是會安卓開發的人來說那不要太簡單,尤其是搜尋那麼方便一大堆,沒有搞過安卓開發的人來說就需要學習下,這個沒有捷徑,只是希望Qt能夠儘可能最大化的封裝一些可以直接使用的類,比如後期版本就提供了許可權申請的類 QtAndroid::requestPermissionsSync 之類的,用起來就非常的爽,不用自己寫個java類調來調去的。

  7. 理論上來說按照Qt提供的萬能大法類QAndroidJniObject,可以不用寫java類也能執行各種處理,拿到安卓庫中的屬性和執行方法,就是寫起來太繞太費勁,在java類中一行程式碼,這裡起碼三行,所以終極大法就是熟悉安卓開發,直接封裝好java類進行呼叫。

  8. 測試發現GetStringUTFChars方法對應的資料字串中不能帶有temp字樣,否則解析有問題,不知什麼原因。

  9. 資料型別引數和返回值型別必須完全一致,否則執行會提示找不到對應的函式,有返回值一定要寫上返回值。

  10. jar檔案對包名的命名沒有要求,只要放在android/libs目錄下即可,安卓底層是通過包名去查詢,而不是通過檔名,你甚至可以將原來的包名重新改成也可以正常使用,比如classes.jar改成test.jar也能正常使用。

安卓綜合應用示例 https://qtchina.blog.csdn.net/article/details/123940153