安卓系统上的Qt蓝牙.通过抽象类上的jni调用java类



这里可能重复,但接受的答案很短,没有多大帮助

我使用的是Android版的Qt 5.2。我想使用我的android设备蓝牙功能,目前Qt框架不直接支持该功能。因此,我已经开始使用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。如何在抽象类上使用QtJNI调用来获得bluetoothManager?

编辑:

我也试过这样做:

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

但仍然得到:

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

getSystemService()是android.content.Context的一个方法。我认为你会得到"Context不是一个有效的对象",因为它是一个抽象类,不能用这种方式实例化。android.app.Service.也是如此

"发现"getSystemService(Context.BLUETOOTH_SERVICE)"似乎是凭空调用的"-在developer.android.com的示例中,它是在this上调用的,this很可能是派生自Activity的类,因此派生自Context。

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

此外,您调用的对象方法似乎有错误的签名:"(Ljava/lang/String;)Ljava/lang/object;">

对于其他可能在这里结束的人,您可以使用获取主上下文

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>()); 

最新更新