0

此处可能重复,但接受的答案很短,没有太大帮助。

我正在使用适用于 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 
4

2 回答 2

0

getSystemService() 是android.content.Context的一个方法。我认为您会得到“上下文不是有效对象”,因为它是一个无法以这种方式实例化的抽象类。android.app.Service 也是如此。

“发现“getSystemService(Context.BLUETOOTH_SERVICE)”似乎被无处调用” - 在您的 developer.android.com 示例中,它被调用,这可能是一个派生自 Activity 的类,因此, 语境。

您需要一个上下文对象来调用 getSystemService()。

此外,您似乎正在调用具有错误签名的对象方法:“(Ljava/lang/String;)Ljava/lang/Object;”

于 2014-01-17T09:10:31.577 回答
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>()); 
于 2017-08-17T13:19:18.170 回答