Привет всем!
Я пишу код, чтобы можно было установить android Bluetooth-соединение через библиотеку QT с использованием JNI. Основная идея состоит в том, чтобы иметь черный ящик, который подключается к устройствам для получения данных, анализа и так далее, поэтому мне нужно использовать QT Bluetooth и не передавать данные устройства из java кода в lib.
Итак.
Сначала я использовал JNIEnv * env, чтобы проверить, могу ли я получить адаптер Bluetooth, и он работает. Затем я использовал QAndroidJniEnvironment, а также получил имя адаптера Bluetooth. Посмотрите на код, пожалуйста.
static jclass jniMathClassID = 0;
static jmethodID jniMathConstructorMethodID = 0;
static jmethodID jniMathElevenMethodID = 0;
QAndroidJniEnvironment qjniEnv;
jclass classBta = qjniEnv->FindClass("android/bluetooth/BluetoothAdapter");
jmethodID methodIdGetAdapter =
qjniEnv->GetStaticMethodID(classBta,
"getDefaultAdapter",
"()Landroid/bluetooth/BluetoothAdapter;");
jmethodID methodIdGetName =
qjniEnv->GetMethodID(classBta,
"getName",
"()Ljava/lang/String;");
jobject objBta = (jobject) qjniEnv->CallStaticObjectMethod(classBta, methodIdGetAdapter);
jstring strName = (jstring) qjniEnv->CallObjectMethod(objBta, methodIdGetName);
const char *result = qjniEnv->GetStringUTFChars(strName, 0);
qDebug() << result;
Итак, здесь я вижу реальное имя адаптера Bluetooth устройства, полученное через QAndroidJniEnvironment.
Проблема возникает, когда я хочу использовать QBluetoothDeviceDiscoveryAgent. Я получил сообщение: qt.bluetooth. android: Устройство не поддерживает Bluetooth
Я посмотрел файл "qbluetoothdevicediscoveryagent_ android. cpp" и увидел, что в конструкторе он использует QAndroidJniObject.
QAndroidJniEnvironment env;
adapter = QAndroidJniObject::callStaticObjectMethod("android/bluetooth/BluetoothAdapter",
"getDefaultAdapter",
"()Landroid/bluetooth/BluetoothAdapter;");
и он не имеет ничего в переменной адаптера, но если я вызову это QAndroidJniObject :: callStaticObjectMethod в моем собственном методе и заменим «android / bluetooth / BluetoothAdapter» на classBta (который вы видели выше), это работает ок.
QAndroidJniObject adapter=QAndroidJniObject::callStaticObjectMethod(
classBta,"getDefaultAdapter","()Landroid/bluetooth/BluetoothAdapter;");
Похоже, что QAndroidJniObject работает некорректно и вызывает неправильный метод. Не могли бы вы помочь мне с этим? Мне действительно нужно, чтобы QBluetoothDeviceDiscoveryAgent работал.