Windows下Qt for Android 編譯安卓C語言可執行程式

Windows下Qt for Android 編譯安卓C語言可執行程式

    作為 C/C 程式設計師,有時候我們希望在安卓上執行從 C/C 生成的可執行程式,而不是在 Java 中通過 jni 的方式來呼叫 C 動態庫。有兩個途徑可以達到這個目的:一個是使用安卓 NDK 提供的工具鏈直接編譯 C 程式碼(其中又有兩種方式,使用 android 的 mk 檔案,使用自己編寫的 Makefile );一個是使用 Qt 5.2 for Android ,Qt Creator 可以生成安卓版本。這裡我們說 Qt for Android,不說 NDK 方式。

    Qt for Android 的環境搭建,可以參考我之前的博文《Windows下Qt 5.2 for Android開發入門》。

    一旦你生成了一個專案,配置好了工具鏈,就可以在 Qt Creator 的專案標籤中選擇安卓版本進行編譯。不過預設編譯出來的是動態庫, so 檔案。而我們想要可執行程式。這個可以通過修改 Makefile 來完成,純手動的方式有以下幾個步驟:

  1. 修改 Makefile ,找到 LFLAGS 開始的那一行,去掉 -shared 和 -Wl,-soname,xxx.so 這兩個連結選項,這楊連結器就會生成可執行程式
  2. 修改 Makefile ,找到 QMAKE_TARGET 和 TARGET 開始的兩行,把 ” = ” 後面的目標修改為你想要的那個名字,假定為 xxx 
  3. 開啟 Qt 5.2.0 for Desktop (MinGW 4.8 32 bit) ,進入你的安卓編譯目錄,執行 mingw32-make ,可以看見, xxx 生成了

    使用原生程式比使用 APK JNI 方式會有一個好處: Java 虛擬機器無法控制原生程式佔用的記憶體,而 APK JNI 的方式, C 程式碼和 Java 程式碼共享整個 Java 虛擬機器的記憶體, C 程式碼會受到虛擬機器記憶體大小的限制。

    如果嫌上面的步驟麻煩(每次 Qt 工程變化都要手動修改 Makefile ,比如往新增了檔案等),可以在 Qt Creator 中給工程新增一個構建步驟(自動修改 Makefile ),順序放在 qmake 之後,這樣每次 qmake 生成了 Makefile ,自定義的構建步驟就會自動執行來修改 Makefile ,在 make 時應用修改,最終生成可執行檔案。下圖是我的一個工程的配置:

    至於怎麼自動修改 Makefile ,可以使用一些開源的文字工具(如 sed for windows 等),這裡就展開了。我是自己寫了個小程式,專用的,不通用,也不提了。