我对一些为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的更新版本而改变了吗?我需要在某个地方进行类型转换吗?我猜只是在较新版本中有更新的函数/调用,但我找不到任何文档(也不知道要查找什么)。
有什么想法吗?
答案 0 :(得分:1)
r19中的编译器比r10中的编译器宽容。参数类型没有改变,但是最近的 clang 要求您添加显式强制转换:
cmd_8.set((const char16_t*)str, env->GetStringLength(cmd));
这表示,您的项目可能会遇到更严重的问题,例如explained @Richard Critten。如果它依赖于 libutils 和其他Android私有库,则无法在Android Marshmallow及更高版本上运行。