Я написал метод, который получает андроид ID в НДКОшибка при получении Android ID в НДК
void getAndroidID(JNIEnv *env, jobject context, char *deviceId){
int android_id_len = 16;
//Get the Setting.Secure class and the Context Class
jclass c_settings_secure = (*env)->FindClass(env, "android/provider/Settings$Secure");
jclass c_context = (*env)->FindClass(env,"android/content/Context");
if(c_settings_secure == NULL || c_context == NULL){
return;
}
//Get the getContentResolver method
jmethodID m_get_content_resolver = (*env)->GetMethodID(env, c_context, "getContentResolver",
"()Landroid/content/ContentResolver;");
if(m_get_content_resolver == NULL){
return;
}
//Get the Settings.Secure.ANDROID_ID constant
jfieldID f_android_id = (*env)->GetStaticFieldID(env, c_settings_secure, "ANDROID_ID", "Ljava/lang/String;");
if(f_android_id == NULL){
return;
}
jstring s_android_id = (*env)->GetStaticObjectField(env, c_settings_secure, f_android_id);
//create a ContentResolver instance context.getContentResolver()
jobject o_content_resolver = (*env)->CallObjectMethod(env, context, m_get_content_resolver);
if(o_content_resolver == NULL || s_android_id == NULL){
return;
}
//get the method getString
jmethodID m_get_string = (*env)->GetStaticMethodID(env, c_settings_secure, "getString",
"(Landroid/content/ContentResolver;Ljava/lang/String;)Ljava/lang/String;");
if(m_get_string == NULL){
return;
}
//get the Android ID
jstring android_id = (*env)->CallStaticObjectMethod(env, c_settings_secure,
m_get_string,
o_content_resolver,
s_android_id);
(*env)->GetStringUTFRegion(env, android_id, 0, android_id_len, deviceId);
deviceId[android_id_len] = '\0';
LOGI("deviceId %s", deviceId);
}
Я тестировал этот код в нескольких телефонах, и она работает во всех из них, за исключением на одном телефоне, где я получить StringIndexOutOfBoundsException
java.lang.StringIndexOutOfBoundsException: length=15; regionStart=0; regionLength=16
, когда я вызываю метод GetStringUTFRegion
.
Почему я получаю исключение и что могу сделать, чтобы исправить это?
спасибо, проблема заключалась в том, что идентификатор Android на этом устройстве был длиной 15 символов в шестнадцатеричной форме, и я всегда ожидал длину 16 (64 бит), я меняю свой код, и я сначала использую функцию GetStringUTFLength' для получения фактической длины строки. –