有没有简单的方法登录Android NDK代码?

waj*_*jiw 66 c java-native-interface logging android android-ndk

我正在寻找一种使用Eclipse在Android NDK应用程序中轻松调试C代码的方法.我已经阅读了使用gdb或类似方法调试应用程序的方法,但我想要的是一种以某种方式将消息推送到Eclipse的方法.

我正在寻找一种简单的解决方案,就像在C中使用打印功能并在DDMS日志或类似的东西中看到它一样简单.有没有人有这方面的经验?

svd*_*ree 119

您可以使用Android日志记录工具:

#include <android/log.h>

#define APPNAME "MyApp"

__android_log_print(ANDROID_LOG_VERBOSE, APPNAME, "The value of 1 + 1 is %d", 1+1);
Run Code Online (Sandbox Code Playgroud)

确保您还链接到Android.mk文件中的日志库:

  LOCAL_LDLIBS := -llog
Run Code Online (Sandbox Code Playgroud)


She*_*ami 12

最简单的方法可能是将printf()语句重定向到系统日志(基于官方ADB参考手册的"Viewing stdout and stderr"部分).

在命令行上键入以下3个命令:

adb shell stop
adb shell setprop log.redirect-stdio true
adb shell start
Run Code Online (Sandbox Code Playgroud)

然后,您可以通过查看Eclipse Debugger的"LogCat"窗口或在命令行上键入它来查看"printf()"语句的输出:

adb logcat
Run Code Online (Sandbox Code Playgroud)

请注意,由于数据在从模拟器或设备传输之前是缓冲的,因此您应该清除stdout缓冲区,例如:

printf("Hello, I am %d years old!\n", 30);
fflush(stdout);
Run Code Online (Sandbox Code Playgroud)

然后,您应该看到以"I/stdout:"开头的日志消息

  • 请注意,此解决方案会破坏JUnit测试.请参阅:http://stackoverflow.com/questions/3462850/trying-to-run-trivial-android-junit-tests-getting-test-run-failed-no-test-re (4认同)

Oni*_*nik 6

到目前为止,还没有人发布有关不同日志级别的信息。答案是尝试使日志记录“图片”已满

#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__)
Run Code Online (Sandbox Code Playgroud)

用法:

char err[] = "wrong";
LOGE("Something went %s", err);
Run Code Online (Sandbox Code Playgroud)

如下所示链接Android日志库。

Android.mk

LOCAL_LDLIBS := -llog
Run Code Online (Sandbox Code Playgroud)

CMakeLists.txt

find_library( log-lib log )
target_link_libraries( ${log-lib} )
Run Code Online (Sandbox Code Playgroud)

进一步阅读:记录


Gen*_*wen 5

您还可以使用一点uti​​l

#include <android/log.h>

#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "native-lib", __VA_ARGS__))
Run Code Online (Sandbox Code Playgroud)

用法:

std::string hello = "Hello from C++";
int a = 1;
LOGI("int %d, string: %s", a, hello.c_str());
Run Code Online (Sandbox Code Playgroud)