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 及更高版本上运行。
我对一些为 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));
这就是说,您的项目可能有更严重的问题,如