有问题的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);