简介
基于上篇 [Qt for android 获取USB设备列表(一)Java方式 获取], 这篇就纯粹多了, 直接将上篇代码转换成JNI方式即可。即所有的设备连接与上篇一致。 (https://listentome.blog.csdn.net/article/details/139205850)
关键代码
cpp
void MainWindow::getDeviceList()
{
QJniObject usbService = QJniObject::getStaticObjectField("android/content/Context",
"USB_SERVICE",
"Ljava/lang/String;");
if (!usbService.isValid())
{
logger("fail to get usb service");
return;
}
QJniObject activity = QJniObject(QNativeInterface::QAndroidApplication::context());
QJniObject usbManager = activity.callObjectMethod("getSystemService",
"(Ljava/lang/String;)Ljava/lang/Object;",
usbService.object<jstring>());
if (!usbManager.isValid())
{
logger("fail to get usb manager");
return;
}
QJniObject usbDeviceListHashMap = usbManager.callObjectMethod("getDeviceList",
"()Ljava/util/HashMap;");
QJniObject devListKeySet = usbDeviceListHashMap.callObjectMethod("keySet",
"()Ljava/util/Set;");
QJniObject devListIter = devListKeySet.callObjectMethod("iterator",
"()Ljava/util/Iterator;");
jint devListSize = usbDeviceListHashMap.callMethod<jint>("size", "()I");
QJniObject usbDevObj;
QJniObject usbDevObjIter;
int vid = 0, pid = 0;
QString devName;
for (int i = 0; i < devListSize; ++i)
{
usbDevObjIter = devListIter.callObjectMethod("next",
"()Ljava/lang/Object;");
usbDevObj = usbDeviceListHashMap.callObjectMethod("get",
"(Ljava/lang/Object;)Ljava/lang/Object;",
usbDevObjIter.object());
vid = usbDevObj.callMethod<jint>("getVendorId", "()I");
pid = usbDevObj.callMethod<jint>("getProductId", "()I");
devName = usbDevObj.callMethod<jstring>("getDeviceName", "()Ljava/lang/String;").toString();
logger(QString("Name: %1, VID: %2, PID: %3").arg(devName).arg(vid).arg(pid));
}
}