2017-01-08 2 views
1

Я написал метод, который получает андроид 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); 
} 

Я тестировал этот код в нескольких телефонах, и она работает во всех из них, за исключением на одном телефоне, где я получить StringIndexOutOfBoundsExceptionjava.lang.StringIndexOutOfBoundsException: length=15; regionStart=0; regionLength=16, когда я вызываю метод GetStringUTFRegion.

Почему я получаю исключение и что могу сделать, чтобы исправить это?

ответ

1

Похоже, вы просите перевести больше символов, чем есть в строке - android_id_len имеет жестко заданное значение 16, тогда как строка в этом случае равна 15, как говорится в сообщении об ошибке. Удостоверьтесь, что вы вычислили правильную длину строки и передали ее до GetStringUTFRegion, и таким образом ваш код будет кросс-устройством общего типа.

+0

спасибо, проблема заключалась в том, что идентификатор Android на этом устройстве был длиной 15 символов в шестнадцатеричной форме, и я всегда ожидал длину 16 (64 бит), я меняю свой код, и я сначала использую функцию GetStringUTFLength' для получения фактической длины строки. –

Смежные вопросы