Java 在NDK中获取Android ID时出错

Java 在NDK中获取Android ID时出错,java,android,android-ndk,Java,Android,Android Ndk,我编写了一个在NDK中获取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/prov

我编写了一个在NDK中获取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\u id\u len
的硬编码值为16,而本例中的字符串是15,如错误消息所示。请确保您计算了字符串的正确长度,并将该长度传递给
GetStringUTFRegion
,这样您的代码将是跨设备通用的。

谢谢,问题是该设备中的Android ID以十六进制形式有15个字符长,我一直希望长度为16(64位),我更改了代码,并首先使用函数
GetStringUTFLength
获取字符串的实际长度。