此处可能重复,但接受的答案很短,没有太大帮助。
我正在使用适用于 Android 的 Qt 5.2。我想使用 Qt 框架目前不直接支持的我的 android 设备蓝牙功能。因此我开始使用 JNI 来访问 Android Java 类和方法。
我可以通过这样做来创建 AudioTimestamp 类的对象:
QAndroidJniObject audioTimestamp2("android/media/AudioTimestamp");
if(!audioTimestamp2.isValid())
{
qDebug() << "audioTimestamp2 is not a valid object";
return false;
}
第一行调用默认构造函数,所以这工作正常。这只是一个测试,看看我是否能够创建一个有效的对象。
当我从 developer.android.com 开始使用蓝牙实现时,我需要通过以下方式获取设备的蓝牙适配器:
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