Хотите сгенерировать случайную строку фиксированной длины из функции 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
происходит сбой.
заранее спасибо
char s[len];
, вы не можете использоватьs[len] = 0;
- вы можете использовать только индексы [0..len-1] - person pskink   schedule 07.09.20170
в конце вашей строки — это специальный символ завершения строки — подробнее: en .wikipedia.org/wiki/C_string_handling и en.wikipedia.org/wiki/Null -terminated_string - person pskink   schedule 07.09.2017char s[len];
доchar s[len+1];
это решило проблему, спасибо - person Om Infowave Developers   schedule 07.09.2017