我正在使用 JNI 代码生成随机字符串并将其返回给使用以下代码的调用函数。
static const char alphanum[] =
"abcdefghijklmnopqrstuvwxyz";
jstring Utils::getRandomString(JNIEnv *env, const int len) {
char s[len + 1];
for (int i = 0; i < len; ++i) {
int p = rand() % (sizeof(alphanum) - 1);
s[i] = alphanum[p];
}
s[len] = 0;
return env->NewStringUTF(s);
}
我对如何在 JNI 中终止字符串感到困惑,我看到有两种方法
s[len] = 0;
和
s[len] = '\0'
谁能解释一下两者的区别?哪个适合 JNI 代码?识别这个东西的原因是应用程序在添加 s[len] = '\0'
后在某些设备上崩溃,当它是 s[len] = 0 ;
它工作正常。
我无法生成此崩溃,但已在结构控制台上报告 http://crashes.to/s/2e4bca9a62c .
最佳答案
您的问题和问题无关 - 让我来回答您的问题... 您的崩溃是因为 NewStringUTF 没有复制它的参数;您有责任在 Java 字符串的整个生命周期内保持内存有效。
然而,您提供了一个局部变量作为指针,它离开了作用域;将对它的访问保留为未定义的行为。
关于android - '\0' 和 0 之间的区别用于终止字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48560217/