2

I wrote some video streamer (C++) on PC and now I try to to implement the same cross platform section on Android. I "played" enough with NDK and know a bit about how to compile and integrate C code with Android (aka JNI).

The problem is that sometimes my application crashes and as you know Android doesn't point me where code failed (in C/C++ part).

Video Streamer code have a lot of libraries and, lets say, open source parts I used so to leave logs - not good idea. I use Eclipse, how can I debug C++ code or does Eclipse have any plugins to debug?

Thanks a lot,

4

2 回答 2

3

用于本机代码的 GDB(GNU 调试器)从 Android 2.2(SDK 级别 8)开始可用。

NDK_DEBUG=1在命令行中使用选项重建 NDK 代码。启动应用程序。然后从 Windows 或 Cygwin 命令行调用“ndk-gdb”命令,而项目下的 jni 文件夹是当前文件夹。您将获得一个 GDB 控制台。键入c并按 Enter 继续程序执行(当 GDB 连接时它会暂停)。

不过,这不适合精神上的弱者。GDB 以其简洁的界面而闻名。但至少它会bt在崩溃发生时为您提供崩溃(命令)的堆栈回溯。

您也可以将 GDB 连接到在早期版本的 Android 上运行的进程,但该过程相当棘手。

GDB 参考在这里

于 2013-03-12T14:25:52.950 回答
3

要记录内容并在 Android 的 logcat 中查看它,我有一个简单的类:

#ifndef LOG_H_
#define LOG_H_

#include <android/log.h>

#define LOGD(LOG_TAG, ...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
#define LOGI(LOG_TAG, ...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
#define LOGV(LOG_TAG, ...) __android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG, __VA_ARGS__)
#define LOGW(LOG_TAG, ...) __android_log_print(ANDROID_LOG_WARN, LOG_TAG, __VA_ARGS__)
#define LOGE(LOG_TAG, ...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)

#endif /* LOG_H_ */

你可以这样使用它:

LOGI("YourClassTag","let's print some stuff: %i, %s", 4, "I'm a string");

要获取有关某些崩溃的更多信息,您可以尝试使用 adb 启用JNICheck

如果您有普通设备,则可以使用以下命令:

adb shell setprop debug.checkjni 1

这不会影响已经运行的应用程序,但是从那时起启动的任何应用程序都将启用 CheckJNI。(将属性更改为任何其他值或简单地重新启动将再次禁用 CheckJNI。)在这种情况下,下次启动应用程序时,您将在 logcat 输出中看到类似的内容:

D 后期启用 CheckJNI

于 2013-03-11T21:14:31.190 回答