env-> NewStringUTF(s)崩溃,不同的ABI版本返回不同的字符串值

时间:2017-09-07 07:34:37

标签: android android-ndk java-native-interface abi ndk-build

想要从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;
}

但仅针对ABI版本jstring temp= env->NewStringUTF(s);

,应用程序因行armeabi-v7a而崩溃

我尝试过的解决方案this solution

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 < / p>

请提供一些返回生成的字符串的解决方案。 env->NewStringUTF()工作于ABI版本x86armeabi-v7a会崩溃。

提前致谢

0 个答案:

没有答案