QT bluetooth .so интеграция в проект Android Java. Проблема с QAndroidJniObject и QBluetoothDeviceDiscoveryAgent - PullRequest
1 голос
/ 07 февраля 2020

Привет всем!

Я пишу код, чтобы можно было установить 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 работал.

...