使用MSBuild构建Android Makefile项目日志异常及NDK相关问题咨询
首先看你提供的代码,这里面有几个明显的错误,可能也是影响日志输出的间接原因,先帮你修正代码:
一、修复代码中的宏定义与格式错误
你的LOGD宏完全不符合printf的调用规则,而且格式符使用有误,修正后的代码如下:
#include <stdio.h> #include <stdlib.h> #define LOG_TAG "TEST_LOG" // 修正后的LOGD宏,模拟Android日志的输出格式 #define LOGD(fmt, ...) printf("[%s] DEBUG: " fmt "\n", LOG_TAG, ##__VA_ARGS__) int main() { size_t datalen = 0; // size_t类型必须用%zu作为格式符,不能用%d,否则会出现格式不匹配问题 LOGD("data length error: %zu", datalen); return 0; }
代码修正点说明:
- 移除了无用的
LOG_ID_RADIO和ANDROID_LOG_DEBUG宏,因为printf不需要这些参数,之前的写法会导致printf接收错误的参数类型,程序运行时可能崩溃或输出乱码。 - 调整
LOGD宏的结构,先输出日志标签和级别,再拼接格式化字符串,保证参数传递符合printf的要求。 - 使用
##__VA_ARGS__处理可变参数为空的场景,避免出现多余逗号导致的编译错误。 - 把
%d改成%zu,因为datalen是size_t类型,对应正确的格式符是%zu。
二、解决构建日志中"error:"无法输出的问题
针对你提到的MSBuild构建时无法输出"error:"组合字符串的问题,大概率是日志流处理或输出级别导致的,试试以下几种方案:
1. 调整MSBuild的日志输出级别
MSBuild默认的日志级别可能会过滤掉部分信息,你可以在构建命令中增加详细度参数,强制输出所有日志:
msbuild /verbosity:diagnostic YourProject.proj
/verbosity:diagnostic是最详细的日志级别,会输出所有构建过程中的信息,包括原本被过滤的行。如果觉得太啰嗦,也可以先用/verbosity:detailed试试。
2. 重定向ndk-build的错误流到标准输出
ndk-build默认会把错误信息输出到stderr(错误流),而MSBuild可能只捕获stdout(标准输出),导致你看不到包含"error:"的错误行。修改你的构建脚本,把错误流重定向到标准输出:
cd C:/workspace/ndkTest/ndk-build/TestCC/jni echo ==== call ndk-build -C C:/workspace/ndkTest/ndk-build/TestCC/jni 2>&1
这里的2>&1就是把stderr(文件描述符2)的内容重定向到stdout(文件描述符1),这样所有日志都会统一输出。
3. 排查是否有日志过滤规则
检查你的MSBuild项目文件(.proj或.vcxproj)中是否有自定义的日志过滤配置,比如是否设置了SuppressMessage或者自定义的日志处理器,这些规则可能会屏蔽包含"error:"的行。
4. 测试基础输出是否正常
先在构建脚本里加一行测试命令,验证MSBuild是否能正常输出"error:"字符串:
echo "test error: this is a test message"
如果这行能正常输出,说明问题出在ndk-build的日志处理上;如果还是看不到,那就是MSBuild本身的过滤规则导致的,需要进一步调整MSBuild的日志参数。
内容的提问来源于stack exchange,提问作者York Shen

