android - '\0' 和 0 之间的区别用于终止字符串

标签 android c++ android-ndk java-native-interface

我正在使用 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/

相关文章:

Android Studio 找不到JDK Mac

android - strerror(errno) 调用 read() 和 write() 时返回 "Invalid argument"

android - 如何在 Android 中使用 std::stoul 和 std::stoull?

android - 单个 StaggeredGridView 中有多个列?

java - 键盘输入错误

android - 如何检查用户是否购买了 IAP 提供的产品

c++ - 对于由其他对象组成的 C++ 类,将这些成员对象设为指针是一种好习惯吗?

c++ - 类模板 cpp、hpp、cpp

c++ - 将 int 数组更改为 char 数组

android - 为什么 Unity 在链接到 OpenCV 时无法加载 android native 库?