首页 > 解决方案 > QT 蓝牙 .so 集成到 Android Java 项目中。QAndroidJniObject 和 QBluetoothDeviceDiscoveryAgent 的问题

问题描述

大家好!

我正在编写代码以使用 JNI 通过 QT 库获得 android 蓝牙连接。主要思想是有一个黑匣子连接到设备以获取数据,分析等,这就是为什么我需要使用QT蓝牙并且不将设备数据从java代码传递到lib。

所以。

起初,我使用 JNIEnv* env 来检查是否可以获得蓝牙适配器,并且它可以工作。然后我使用了 QAndroidJniEnvironment 并获得了蓝牙适配器名称。请看代码。

  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;



因此,在这里我可以看到通过 QAndroidJniEnvironment 接收到的真实设备蓝牙适配器名称。

当我想使用 QBluetoothDeviceDiscoveryAgent 时会出现此问题。我收到一条消息:qt.bluetooth.android:设备不支持蓝牙

我查看了“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工作。

标签: javaandroidqtbluetoothjava-native-interface

解决方案


推荐阅读