使用QtCreator加速Android NDK開發調試

爲APP開發JNI接口以及NDK動態庫的時候,須要頻繁修改和調試C/C++代碼,若是在eclipse或AndroidStudio開發的話,須要1)clean項目,2)ndk build 3)生成APK,啓動調試,實際會卸載已安裝APK再裝一遍,這個過程至關耗時,快則7秒左右,慢則十幾秒以上,有沒有可能不須要從新安裝APK,只須要替換它的so庫,重啓APP就能自動加載生效?即:c++

  • 執行ndk-build生成soshell

  • 替換APP在手機上已安裝的so庫eclipse

  • 重啓APP編輯器

通過摸索發現能夠,整個過程時間縮短爲3秒左右。但替換so須要root權限,若是沒有root權限怎麼辦?如下介紹在不須要root權限的環境下實現的方法。函數

第一步:先將so文件push到sdcard上:ui

adb push libkplayer.so /sdcard/

第二步:進入shell,而且換APP的身份:spa

adb shell
run-as com.xxx.jkplayer  #APP包名

這時shell自動切換到/data/data/com.xxx.jkplayer目錄下,此目錄是可寫的,而原來打包在APP裏的so庫存放在/data/data/com.xxx.jkplayer/lib/下是不可寫,因此解決的方法是將修改好的so庫copy到/data/data/com.xxx.jkplayer,這須要在JAVA層稍爲修改一下加載庫的方法:調試

//System.loadLibrary("jkplayer");
System.load("/data/data/com.xxx.jkplayer/libjkplayer.so");

從新編譯和安裝APK,這時啓動時會提示loadLibrary失敗,不要緊,作完下一步就能夠了。日誌

第三步:從/sdcard上copy過來並賦予可執行權限:code

cp /sdcard/libjkplayer.so .  #當前目錄在/data/data/com.xxx.jkplayer
chmod 0755 libjkplayer.so

如今從新啓動APP,就能夠成功把/data/data/com.xxx.jkplayer/libjkplayer.so load起來,下次咱們只須要替換掉這個so,重啓APP就能夠了,而不須要點AndroidStudio調試按鈕了。

咱們固然但願寫一個腳原本自動實現替換so並重啓APP的動做,啓動APP:

adb shell am start -n com.xxx.jkplayer/com.xxx.jkplayer.MainActivity

重啓以前,能夠先強行中止APP:

adb shell am force-stop com.xxx.jkplayer

將這些腳本和ndk-build等組合在一塊兒,每次修改完C/C++代碼後,執行腳本,只須要3秒左右APP已經重啓就緒。下面我介紹如何爲QtCreator IDE配置這些腳本,而且只須要點一個run按鈕或ctrl+r就能直接跑起這個腳本,還能顯示編譯錯誤和點擊定位錯誤,還能在QtCreator中看到Android的log輸出。

爲何使用QtCreator(不須要裝QtSDK)?
由於它用來寫C/C++代碼,輕量級跨平臺,代碼補全高亮不在話下,書籤、代碼大綱、編輯器分欄、快捷鍵都挺好使。 好吧,真正是由於我一直用它,因此以爲順手。

ndk-build編譯錯誤提示,點擊錯誤跳轉到源代碼處
ndk-build編譯錯誤提示

ndk-build的編譯輸出窗口,也能夠經過配置將logcat的日誌顯示到此窗口來。
圖片描述

JNI API 自動補全:
圖片描述

常常與JNI打資產,若是靠手工查手冊就欲哭無淚了-_-~~
也能夠配置使得NDK裏的庫函數和頭文件均可以補全,代碼閱讀時點擊跳轉。

下面介紹配置過程。

第一步:import jni目錄,完成後,保存全部,QtCreator的工程文件也會保存在import目錄下
圖片描述

第二步:進入項目屬性,刪除默認的構建步驟(ctrl+b時調用),添加本身的:
圖片描述

其中的%{buildDir}\build.bat指的是Qt工程(xxxx.qtcreator)所在目錄下的build.bat腳本,內容爲:

$NDK\ndk-build -c jni

NDK爲指向ndk sdk根目錄的環境變量,-c參數指向你jni工程目錄,即裏面存放c/c++/Android.mk等,若是Qt工程建在jni目錄下,-c jni不須要。

clear.bat的內容:

$NDK\ndk-build -c jni clear

第三步:添加自定義的執行步驟(ctrl+r時調用):
圖片描述

run.bat:

adb shell am force-stop com.xxx.jkplayer
adb push libs\armeabi-v7a\libjkplayer.so /sdcard/ 
&& adb shell "run-as com.xxx.jkplayer cp -v /sdcard/libjkplayer.so ." 
&& adb shell "run-as com.xxx.jkplayer chmod 0755 libjkplayer.so" 
&& adb shell am start -n com.xxx.jkplayer/com.xxx.jkplayer.MainActivity

executable.bat:

adb shell "logcat -c && logcat -v time | grep -i xxx" #將logcat輸出到QtCreator上來

實際使用發現這樣打印出來的每行log都被追加了一個空行。固然,你也可使用AndroidStudio的日誌查看器。
OK,如今已經能夠用了,編寫代碼,ctrl+r一下,編譯、部署so、重啓APP,一步到位。

最後附上代碼補全設置:
圖片描述保存後,QtCreator會自動reload,編輯器就馬上高亮JNI和NDK函數,按住ctrl鍵,將鼠標移到符號上點擊就能夠跳轉,alt+左箭頭返回。

相關文章
相關標籤/搜索