爲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的編譯輸出窗口,也能夠經過配置將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+左箭頭返回。