我正在寻找一种使用Eclipse在Android NDK应用程序中轻松调试C代码的方法。我已经阅读了使用gdb或类似工具调试应用程序的方法,但是我想要的是以某种方式将消息推送到Eclipse的方法。
我正在寻找一种简单的解决方案,就像在C语言中使用打印功能并在DDMS日志或类似工具中看到它一样。有没有人有这样做的经验?
Answers:
您可以使用Android日志记录功能:
#include <android/log.h>
#define APPNAME "MyApp"
__android_log_print(ANDROID_LOG_VERBOSE, APPNAME, "The value of 1 + 1 is %d", 1+1);
确保您还链接到Android.mk文件中的日志记录库:
LOCAL_LDLIBS := -llog
到目前为止,还没有人发布有关不同日志级别的信息。答案是尝试使日志记录“图片”满。
#include <android/log.h>
#define TAG "MY_TAG"
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, TAG, __VA_ARGS__)
#define LOGW(...) __android_log_print(ANDROID_LOG_WARN, TAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, TAG, __VA_ARGS__)
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, TAG, __VA_ARGS__)
用法:
char err[] = "wrong";
LOGE("Something went %s", err);
如下所示链接Android日志库。
Android.mk:
LOCAL_LDLIBS := -llog
CMakeLists.txt:
find_library( log-lib log )
target_link_libraries( ${log-lib} )
进一步阅读:日志记录
最简单的方法可能是将printf()语句重定向到系统日志(基于ADB官方参考手册的“查看stdout和stderr”部分)。
在命令行上键入以下3条命令:
adb shell stop
adb shell setprop log.redirect-stdio true
adb shell start
然后,可以通过查看Eclipse Debugger的“ LogCat”窗口或在命令行中键入以下内容来查看“ printf()”语句的输出:
adb logcat
请注意,由于数据是在从仿真器或设备传输之前进行缓冲的,因此您一定要刷新标准输出缓冲区,例如:
printf("Hello, I am %d years old!\n", 30);
fflush(stdout);
然后,您应该会看到一条以“ I / stdout:”开头的日志消息。
此处介绍了一种替代解决方案(使用调试器):
ADT 20包含一个NDK插件,该插件为在Eclipse中构建和调试NDK项目提供支持。本文档介绍了如何安装和使用NDK插件。说明非常简单,仅需几个步骤。
这是我找到的最简单的解决方案,对我有用。
注意:如果使用的是ADT捆绑包,则只需安装C开发工具以及安装新软件(请参见屏幕截图),即可立即转到“使用NDK插件”部分。
编辑: eclipse juno http://code.google.com/p/android/issues/detail?id=33788中的CDT似乎有问题,导致eclipse的调试器无法找到断点。我使用的解决方法是在调试模式下启动应用程序(不是作为本机应用程序调试,而是“常规”调试),然后在命令行中转到项目根目录并键入ndk-gdb
(这将gdb.setup
在obj/local/armeabi
文件夹中创建文件)。之后,断点照常工作。
在上面链接中与该问题有关的评论中,他们提出了其他解决方法,但我没有尝试过,因为它们似乎需要付出更多的努力。
对于那些在挣扎中的人
LOCAL_LDLIBS := -llog
不起作用,只需在每个之后添加
include $(CLEAR_VARS)
不知道为什么,但是对我有用。
干杯!