一.错误现象
一个Qt 蓝牙程序,在Andorid第一次未扫描到设备就闪退,
D BluetoothAdapter: cancelDiscovery
D BluetoothAdapter: cancelDiscovery = true
D BT8510 : (null):0 ((null)): qt.bluetooth.android: DeviceDiscoveryBroadcastReceiver::onReceive() - event: "android.bluetooth.adapter.action.DISCOVERY_FINISHED"
Qt Android Fatal signal 11 (SIGSEGV), code 1, fault addr 0x63002d in tid 5248 (qtMainLoopThrea) 定位
"org.qtproject.example" died.
二.集成bugly 机制
在Android原生下,使用各种统计和错误上报机制很常见,如umeng,bugly等.
其中bugly 功能很强,而且NDK 报错功能,这样我们Qt C++错误可以直接提示出错类和方法, 这个为最终解决bug提供很好条件
- 准备条件,首在http://bugly.qq.com 注册成开发者,并注册一个Android应用
image.png
这里最关键是一个App ID 形如 "7b422b4b78"字符串.
-
在Qt 增加对Android 单独支持,首选建立一个Qt Android Template
image.png
成功后,在other file 会增加相应的Android支持
image.png
3.在Android项目增加相关值.
bugly 官方集成文档
https://bugly.qq.com/docs/user-guide/instruction-manual-android/?v=20180913155123
3.1 增加引用库语句
这里文档是针对Android studio 的model/build.gradle的.但Qt生成没有 ,可直接在build.gradle 修改也没问题,
//对NDK支持,必加
android {
defaultConfig {
ndk {
// 设置支持的SO库架构
abiFilters 'armeabi-v7a' //<---注意这里要与Qt Android支持cpu一致
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.tencent.bugly:crashreport:latest.release' //手动增加的bugly的引用
compile 'com.tencent.bugly:nativecrashreport:latest.release' ///手动增加的bugly NDK 的引用
}
3.2 增加一个QtApplication子类,用于全局初始化
这里需要用到java相关知识,如果这个类包是 cn.bluedrum.则要手工创建 src/cn/bluedrum 目录(QtCreator 不会自动创建)
在这个目录创建java文件
package cn.bluedrum;
import com.tencent.bugly.Bugly;
import android.util.Log;
//注意这里的基类,必须是QtApplication
public class BDQApplication extends org.qtproject.qt5.android.bindings.QtApplication{
@Override
public void onCreate() {
super.onCreate();
Log.d("BDQ","show front activity ");
//这里对bugly进行初始化,里面是你申请的App ID
Bugly.init(getApplicationContext(), "7b422b4b78", true);
}
}
3.3 修改AndroidManifest.xml
增加对本Application类的引用,以及bugly所需要权限
<application android:hardwareAccelerated="true" android:name="cn.bluedrum.BDQApplication" android:label="-- %%INSERT_APP_NAME%% --">
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_LOGS" />
然后编译接入wifi后即可在后台查看相关数据
三.最终解决
image.png因为支持ndk捕获,所以直接显示C++哪个类的方法出错,
提示在HBluetoothManager::StopScan() 中的qDebug() <<出错
代码如下:
if(mScanState == WORK_SCAN){
qDebug() << "work scan ,device "<< getCurrentDevice(); //<-造成段错误地方
if(getCurrentDevice()==NULL)
emit deviceConnectTimeout();
}
原因是getCurrentDevice() 为NULL直接赋给qDebug() <<NULL ; 即会造成段错误,(后来发现,一个对象指针没有赋初值NULL)
改正很简单,
if(mScanState == WORK_SCAN){
if(getCurrentDevice()==NULL){
qDebug() << "work scan ,none device find. ";
emit deviceConnectTimeout();
}
else{
qDebug() << "work scan ,device "<< getCurrentDevice()->getAddress();
}
}
网友评论