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

在Java中:BluetoothAdapter.getDefaultAdapter().getName()
我知道我可以将其包装在一个通过jni调用的java函数中,但是,如何仅用jni / android-ndk在C++中实现相同的目的?

最佳答案

首先,您需要具有读取此值的权限(无论它是本地值都需要)。

添加到AndroidManifest.xml中:

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

在本地jni -land中,事情有点麻烦。简而言之,这是您需要的:
  • 获取类android.bluetooth.BluetoothAdapter
  • 获取静态方法BluetoothAdapter.getDefaultAdapter()
  • 获取方法BluetoothAdapter.getName()

  • 为了:
  • 2上调用1以获取默认的BluetoothAdapter实例
  • getName()调用实例上的4.以获取适配器的名称。

  • 这与Java单行代码相同,只是分解了。

    代码(假设您已经有一个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);
    

    09-26 18:19