我需要在 Android Studio 中构建 NDK. 但它返回一个错误
I need to build the NDK in Android Studio. but it returns an error
当我尝试构建这个项目时,我遇到了几个错误:
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;
错误输出中的其余行只是有关第一个错误的附加说明。这两个修复应该让你开始。
- (C++)分析树以计算返回错误值的简单算术表达式
- glad 导致 glfwSwapBuffers 返回错误消息
- 我的模板类方法返回错误类型?
- 共享内存:MapViewOfFile 返回错误 5
- 使用 std::forward_list 返回错误的队列实现
- FFMPEG:sws_scale返回错误:切片参数 0, 2160 无效
- __int64 CString 返回错误的值 - C++ MFC
- C++ OpenGL 中,绘制形状返回错误
- Python os.system() 返回错误值
- 函数从指针 c++ 中获取错误的值并返回错误的答案
- LibClang clang_getArgType() 返回错误的类型
- 除法函数返回错误的值
- 当命令失败时,gzip 会在 C++ 中返回错误代码吗?
- 矩阵逆变器返回错误的反转
- openCL-创建子缓冲区返回错误代码13
- Qt SQL LIKE语句返回错误
- GetLastError()从FtpPutFile()返回错误6
- PfCreateInterface返回错误120(未实现)
- 为什么 Pa_GetStreamTime() 返回错误?
- G++ 在尝试使用 G++ 使用 openCV 进行编译后返回错误