env->NewStringUTF (s) получают сбой, и другая версия ABI возвращает другое строковое значение

Хотите сгенерировать случайную строку фиксированной длины из функции JNI, для которой я использовал функцию ниже

static const char alphanum[] =
        "abcdefghijklmnopqrstuvwxyz";

jstring Utils::getRandomString(JNIEnv *env, const int len) {


    char s[len];
    for (int i = 0; i < len; ++i) {
        int p = rand() % (sizeof(alphanum) - 1);
        s[i] = alphanum[p];
    }
    s[len] = 0;

    __android_log_print(ANDROID_LOG_DEBUG, "LOG_TAG", "getRandomString  %s", s);


  jstring  temp= env->NewStringUTF(s);

    return temp;
}

но приложение получает сбой для строки jstring temp= env->NewStringUTF(s); только для версии ABI armeabi-v7a

для решения, которое я пробовал это решение

jstring Utils::getRandomString(JNIEnv *env, const int len) {


    char s[len];
    for (int i = 0; i < len; ++i) {
        int p = rand() % (sizeof(alphanum) - 1);
        s[i] = alphanum[p];
    }
    s[len] = 0;
    __android_log_print(ANDROID_LOG_DEBUG, "LOG_TAG", "getRandomString 2 %s", s);


    jbyteArray array = env->NewByteArray(len);
    env->SetByteArrayRegion(array, 0, len, (const jbyte *) s);
    jstring strEncode = env->NewStringUTF("UTF-8");
    jclass cls = env->FindClass("java/lang/String");
    jmethodID ctor = env->GetMethodID(cls, "<init>", "([BLjava/lang/String;)V");
    jstring object = (jstring) env->NewObject(cls, ctor, array, strEncode);


    __android_log_print(ANDROID_LOG_DEBUG, "LOG_TAG", "getRandomString 3 %s",
                        env->GetStringUTFChars(object, 0));
//    jstring  temp= env->NewStringUTF(s);

    return object;
}

но он отлично работает для версии ABI armeabi-v7a, когда мы выполняем тот же код в ABI x86, он возвращает неожиданный вывод, например PKdhtXMmr18n2L9K�ؾ�����-DL

пожалуйста, предоставьте какое-нибудь решение, которое возвращает сгенерированную строку. env->NewStringUTF() работает с версией ABI x86 на armeabi-v7a происходит сбой.

заранее спасибо


person Om Infowave Developers    schedule 07.09.2017    source источник
comment
если у вас есть char s[len];, вы не можете использовать s[len] = 0; - вы можете использовать только индексы [0..len-1]   -  person pskink    schedule 07.09.2017
comment
@pskink, вы спасли мой день, позвольте мне протестировать на других устройствах, спасибо   -  person Om Infowave Developers    schedule 07.09.2017
comment
я проверил, если я удалил s[len] = 0, то он возвращает строку, подобную этой vaxturfxligzdhkwdyfmymjentckupgh�i�������L���� как закончить строку   -  person Om Infowave Developers    schedule 07.09.2017
comment
вы не можете просто удалить параметр 0 в конце вашей строки — это специальный символ завершения строки — подробнее: en .wikipedia.org/wiki/C_string_handling и en.wikipedia.org/wiki/Null -terminated_string   -  person pskink    schedule 07.09.2017
comment
я обновил char s[len]; до char s[len+1]; это решило проблему, спасибо   -  person Om Infowave Developers    schedule 07.09.2017
comment
хорошо, вот как это должно быть сделано   -  person pskink    schedule 07.09.2017
comment
@pskink спасибо, также нет необходимости добавлять это решение stackoverflow.com/a/34218851/2941375 удалил это, проблема только с длиной массива   -  person Om Infowave Developers    schedule 07.09.2017