为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+左箭头返回。