有问题的Android API是android.bluetooth.BluetoothAdapter,其成员函数getName()
返回适配器的用户友好名称。
在java中:BluetoothAdapter.getDefaultAdapter().getName()
我知道我可以将它包装在一个java函数中,我通过jni
调用它,但是,如何才能在C++
中实现相同的功能,仅使用jni / android-ndk?
答案 0 :(得分:1)
首先,您需要获得读取此值的权限(无论是否为原生值,您都需要这个值。)
添加到AndroidManifest.xml
:
<uses-permission android:name="android.permission.BLUETOOTH"/>
在土生土长的jni
土地上,事情有点麻烦。简而言之,这就是您所需要的:
android.bluetooth.BluetoothAdapter
BluetoothAdapter.getDefaultAdapter()
BluetoothAdapter.getName()
为了:
2
上致电1
以获取默认的BluetoothAdapter
实例getName()
的实例上调用4.
以获取适配器的名称。 这与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);