Bluetooth с Qt на Android. Вызов java классов через jni на абстрактном классе

Возможный дубликат Вот, но принятый ответ очень короткий и не очень помогает.

Я использую Qt 5.2 для Android. Я хочу использовать функциональность Bluetooth моего Android-устройства, которая в настоящее время не поддерживается непосредственно платформой Qt. Поэтому я начал использовать JNI для доступа к классам и методам Java Java.

Я могу создать объект класса AudioTimestamp следующим образом:

QAndroidJniObject audioTimestamp2("android/media/AudioTimestamp");

if(!audioTimestamp2.isValid())
{
qDebug() << "audioTimestamp2 is not a valid object";
return false;
}

Первая строка вызывает конструктор по умолчанию, поэтому он работает нормально. Это был просто тест, чтобы увидеть, смогу ли я создать действительный объект.

При запуске с реализацией Bluetooth я прочитал с developer.android.com, что мне нужно получить адаптер Bluetooth устройства:

BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
BluetoothAdapter mBluetoothAdapter = bluetoothManager.getAdapter();

поэтому я попытался сделать это так:

//Create Java string used to obtain bluetooth adapter.
QAndroidJniObject systemService = QAndroidJniObject::fromString("BLUETOOTH_SERVICE");

//Create Context Object.
QAndroidJniObject context("android/content/Context");

if(!context.isValid())
{
qDebug() << "context is not a valid object";
return false;
}

//Call getSystemService method on context object and return manager object.
QAndroidJniObject bluetoothManager = context.callObjectMethod("getSystemService", "(Ljava/lang/String;)Landroid/bluetooth/BluetoothManager;", systemService.object<jstring>());

if(!bluetoothManager.isValid())
{
qDebug() << "bluetoothManager is not a valid object";
return false;
}

//Call getAdapter() on manager.
QAndroidJniObject bluetoothAdapter = bluetoothManager.callObjectMethod("getAdapter", "()Landroid/bluetooth/BluetoothAdapter;");

//More code

if (!bluetoothAdapter.callMethod<jboolean>("isEnabled"))
{
qDebug() << "Bluetooth is off";

//Code to ask user to turn bluetooth on here...
}

Вскоре я понял, что getSystemService (Context.BLUETOOTH_SERVICE) кажется вызванным из ниоткуда. Он принадлежит абстрактному классу Context.java. Как я могу использовать вызовы Qt JNI для абстрактного класса, чтобы получить bluetoothManager?

РЕДАКТИРОВАТЬ:

Я попытался сделать это также:

QAndroidJniObject context("android/app/Service");

но все равно получаю

D/Qt      (22736): ..\AndroidTest\bluetooth.cpp:33 (bool Bluetooth::start()): context is not a valid object

0

Решение

getSystemService () является методом android.content.Context. Я думаю, что вы получаете «контекст не является допустимым объектом», потому что это абстрактный класс, который не может быть создан таким образом. То же самое для android.app.Service.

«выяснилось, что« getSystemService (Context.BLUETOOTH_SERVICE) », кажется, вызывается из ниоткуда» — в вашем примере от developer.android.com он вызывается для этого, что, вероятно, является классом, производным от Activity и, как результат, Контекст.

Вам нужен объект контекста для вызова getSystemService ().

Кроме того, вы, кажется, вызываете объектный метод с неправильной подписью: «(Ljava / lang / String;) Ljava / lang / Object;»

0

Другие решения

просто для тех, кто может оказаться здесь, вы можете получить основной контекст, используя

QtAndroid::androidActivity()

Вот как вы используете это в вашем случае:

// from https://developer.android.com/reference/android/content/Context.html#BLUETOOTH_SERVICE
// note that the actual string value is "bluetooth" not "BLUETOOTH_SERVICE", Context.BLUETOOTH_SERVICE is a constant that holds "bluetooth" string value
QAndroidJniObject service_name = QAndroidJniObject::fromString("bluetooth");

// this is your context
QAndroidJniObject activity = QtAndroid::androidActivity();

// now you get your bluetooth manager
QAndroidJniObject bluetoothManager = activity.callObjectMethod("getSystemService","(Ljava/lang/String;)Ljava/lang/Object;", service_name.object<jstring>());
0

По вопросам рекламы [email protected]