从JNI / C ++获取Android蓝牙适配器名称

时间:2015-03-11 15:48:09

标签: android c++ bluetooth android-ndk java-native-interface

有问题的Android API是android.bluetooth.BluetoothAdapter,其成员函数getName()返回适配器的用户友好名称。

在java中:BluetoothAdapter.getDefaultAdapter().getName()

我知道我可以将它包装在一个java函数中,我通过jni调用它,但是,如何才能在C++中实现相同的功能,仅使用jni / android-ndk?

1 个答案:

答案 0 :(得分:1)

首先,您需要获得读取此值的权限(无论是否为原生值,您都需要这个值。)

添加到AndroidManifest.xml

<uses-permission android:name="android.permission.BLUETOOTH"/>

在土生土长的jni土地上,事情有点麻烦。简而言之,这就是您所需要的:

  1. 获取课程android.bluetooth.BluetoothAdapter
  2. 获取静态方法BluetoothAdapter.getDefaultAdapter()
  3. 获取方法BluetoothAdapter.getName()
  4. 为了:

    1. 2上致电1以获取默认的BluetoothAdapter实例
    2. getName()的实例上调用4.以获取适配器的名称。
    3. 这与java one-liner相同,只是细分了。


      代码(假设您已有JNIEnv个对象):

      // 1. Get class
      // The path matches the package hierarchy of
      // 'android.bluetooth.BluetoothAdapter'
      jclass classBta = env->FindClass("android/bluetooth/BluetoothAdapter");
      
      // 2. Get id of the static method, getDefaultAdapter()
      // Search the web for 'jni function signature' to understand
      // the third argument. In short it's a function that takes no arguments,
      // hence '()', and returns an object of type
      // android.bluetooth.BluetoothAdapter, which uses syntax "L{path};"
      jmethodID methodIdGetAdapter =
          env->GetStaticMethodID(classBta,
                                 "getDefaultAdapter",
                                 "()Landroid/bluetooth/BluetoothAdapter;");
      
      // 3. Get id of the non-static method, getName()
      // The third argument is the getName function signature,
      // no arguments, and returns a java.lang.String object.
      jmethodID methodIdGetName =
          env->GetMethodID(classBta,
                           "getName",
                           "()Ljava/lang/String;");
      
      // 4. We get the instance returned by getDefaultAdapter()
      jobject objBta = (jobject)
          env->CallStaticObjectMethod(classBta, methodIdGetAdapter);
      
      // 5. Call member method getName on instance
      jstring strName = (jstring)
          env->CallObjectMethod(objBta, methodIdGetName);
      
      // Convert jstring to a regular string
      const char *result = env->GetStringUTFChars(strName, 0);
      std::string blueToothName(result);
      

      为了清楚起见,我省略了合理的检查以确定各种功能是否成功,以及清理:

      env->DeleteLocalRef(classBta);
      env->DeleteLocalRef(objBta);
      env->DeleteLocalRef(strName);
      env->ReleaseStringUTFChars(strName, result);