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

时间:2019-03-31 19:37:43

标签: android c++ android-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的更新版本而改变了吗?我需要在某个地方进行类型转换吗?我猜只是在较新版本中有更新的函数/调用,但我找不到任何文档(也不知道要查找什么)。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

r19中的编译器比r10中的编译器宽容。参数类型没有改变,但是最近的 clang 要求您添加显式强制转换:

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

这表示,您的项目可能会遇到更严重的问题,例如explained @Richard Critten。如果它依赖于 libutils 和其他Android私有库,则无法在Android Marshmallow及更高版本上运行。