Android 开发:将代码更新到更新的 NDK?

Android development: updating code to more recent NDK?

我对一些为 Android NDK 10d 编写的代码有疑问。这不是我的代码,但我想分叉并重新编译这个项目。但是我 运行 遇到了当前 NDK (19c) 的问题。我也在其他项目中看到过代码片段,但我找不到合适的方法来更新这一部分。也许这里有人有想法或可以解释问题到底是什么?

代码:

JNIEXPORT jint JNICALL Java_jackpal_androidterm_TermExec_createSubprocessInternal(JNIEnv *env, jclass clazz,
    jstring cmd, jobjectArray args, jobjectArray envVars, jint masterFd)
{
    const jchar* str = cmd ? env->GetStringCritical(cmd, 0) : 0;
    String8 cmd_8;
    if (str) {
        cmd_8.set(str, env->GetStringLength(cmd));
        env->ReleaseStringCritical(cmd, str);
    }

...

    int ptm = create_subprocess(env, cmd_8.string(), argv, envp, masterFd);

return ptm;
}

我得到以下错误(参考cmd_8.set(str, env->GetStringLength(cmd));):

process.cpp:210:19: error: cannot initialize a parameter of type 'const char16_t *' with an lvalue of type 'const jchar *' (aka 'const unsigned short *')
        cmd_8.set(str, env->GetStringLength(cmd));
                  ^~~

所以我猜参数类型随着新版本的 NDK 发生了变化?我需要在某处进行类型转换吗?我想在较新的版本中刚刚更新了 functions/calls,但我找不到任何文档(也不知道要查找什么)。

有什么想法吗?

r19 中的编译器不如 r10 中的编译器宽容。参数类型没有改变,但是最近的clang需要你加上显式的cast:

 cmd_8.set((const char16_t*)str, env->GetStringLength(cmd));

这就是说,您的项目可能有更严重的问题,如 @Richard Critten。如果它依赖于 libutils 和其他 Android 私有库,它将无法在 Android Marshmallow 及更高版本上运行。