我需要在 Android Studio 中构建 NDK. 但它返回一个错误

I need to build the NDK in Android Studio. but it returns an error

本文关键字:返回 错误 一个 NDK Android Studio 构建      更新时间:2023-10-16

当我尝试构建这个项目时,我遇到了几个错误:

Build command failed.
Error while executing process E:sdkndk-bundlendk-build.cmd with arguments {NDK_PROJECT_PATH=null APP_BUILD_SCRIPT=D:TASKworkspace_3android-event-injector-masterAndroidEventInjectorsrcmainjniAndroid.mk APP_ABI=x86_64 NDK_ALL_ABIS=x86_64 NDK_DEBUG=1 APP_PLATFORM=android-21 NDK_OUT=D:/TASK/workspace_3/android-event-injector-master/AndroidEventInjector/build/intermediates/ndkBuild/debug/obj NDK_LIBS_OUT=D:TASKworkspace_3android-event-injector-masterAndroidEventInjectorbuildintermediatesndkBuilddebuglib D:/TASK/workspace_3/android-event-injector-master/AndroidEventInjector/build/intermediates/ndkBuild/debug/obj/local/x86_64/libEventInjector.so}
[x86_64] Compile : EventInjector <= EventInjector.c
D:/TASK/workspace_3/android-event-injector-master/AndroidEventInjector/src/main/jni/EventInjector.c:83:7:
error: format string is not a string literal (potentially insecure) [-Werror,-Wformat-security]
LOGD(szBuffer);
^~~~~~~~
D:/TASK/workspace_3/android-event-injector-master/AndroidEventInjector/src/main/jni/EventInjector.c:49:65:
note: expanded from macro 'LOGD'
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG , TAG, VA_ARGS)
^~~~~~~~~~~
D:/TASK/workspace_3/android-event-injector-master/AndroidEventInjector/src/main/jni/EventInjector.c:83:7:
note: treat the string as an argument to avoid this
LOGD(szBuffer);
^
"%s",
D:/TASK/workspace_3/android-event-injector-master/AndroidEventInjector/src/main/jni/EventInjector.c:49:65:
note: expanded from macro 'LOGD'
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG , TAG, VA_ARGS)
^
D:/TASK/workspace_3/android-event-injector-master/AndroidEventInjector/src/main/jni/EventInjector.c:242:28:
error: non-void function 'Java_net_pocketmagic_android_eventinjector_Events_intSendEvent' should return a value [-Wreturn-type]
if (fd <= fileno(stderr)) return;
^
2 errors generated.
make: *** [D:/TASK/workspace_3/android-event-injector-master/AndroidEventInjector/build/intermediates/ndkBuild/debug/obj/local/x86_64/objs-debug/EventInjector/EventInjector.o] Error 1

当原始 Github 上传者构建它时,这两个错误似乎都被视为警告(并被抑制或忽略)。

由于不同的编译器设置或默认值,它们在您构建时显示为错误(它们应该,IMO)。

在短期内,您可以更改编译器标志以忽略这些标志,但如果您实际修复它们(并向 Github 提交拉取请求),或者至少通知维护者这样做会更好。

  • EventInjector.c(83:7):错误:格式字符串不是字符串文字(可能不安全)[-Werror,-Wformat-security]

    LOGD(szBuffer);
    ^~~~~~~~
    

    看起来这个宏像 printf 一样使用,例如:

    LOGD("The %s is %d years old", "dog", 7);
    

    因此,第一个参数被特殊解释;具有特殊格式序列的字符串(例如'%s')。

    此警告/错误提醒您传递可能是用户数据的内容的危险,例如LOGD(user_input).如果user_input不包含任何特殊格式字符 ('%'),那么您可能没问题。

    但如果确实如此,那么日志记录函数将期望遵循其他参数(您没有提供),因此它会从堆栈中获取一些不应该抓取的内容。这是一个安全漏洞,也是一个潜在的崩溃

    解决方案是添加一个文字格式字符串:

    LOGD("%s", szBuffer);
    

    。这样szBuffer可以包含任何东西,而且不会把事情搞砸。

     

  • EventInjector.c(242:28):错误:非无效函数"Java_net_pocketmagic_android_eventinjector_Events_intSendEvent"应返回一个值 [-Wreturn-type]

    if (fd <= fileno(stderr)) return;
    ^
    

    Java_net_pocketmagic_android_eventinjector_Events_intSendEvent函数被声明为返回一个jint,但上面的 return 语句没有返回任何内容。调用者会得到一些东西,那么编译器应该怎么做?

    这通常是由于开发人员的疏忽,因此它被视为错误,尽管它可以被视为警告,编译器只是返回"jint"类型的默认值。

    对此的解决方案是在返回后添加一个值。如果您禁用此错误/警告,我相信编译器将生成代码以默认返回(jint)0

    相反,我会继续修复它:

    if (fd <= fileno(stderr)) return (jint)0;
    

错误输出中的其余行只是有关第一个错误的附加说明。这两个修复应该让你开始。