2

このログ ステートメントを機能するように移植しようとしているので、#define することで Linux と Android で実行できます。

__android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)

Linux と Android の両方で実行できるようにアプリをクロスコンパイルしました。ただし、Linux には同等の機能がないため、自分でやろうとしました。

/** ANDROID */
#if defined(__ANDROID__)
#include <android/log.h>
#define LOG_ERROR ANDROID_LOG_ERROR
#define LOG(PRIORITY, fmt, ...)  __android_log_print(ANDROID_LOG_UNKNOWN, LOG_TAG, fmt, ##__VA_ARGS__)
/** LINUX */
#elif defined(linux) || defined(__linux) || defined(__linux__)
#define LOG_ERROR LINUX_LOG_ERROR
#define LOG(PRIORITY, fmt, ...) printf(PRIORITY fmt, ##__VA_ARGS__)
#endif

そして、Linuxで実行するときにこのように使用します

LOG(LOG_ERROR, "Testing loggging [ %d ]", test);

これを行うより良い方法はありますか?

ご提案いただきありがとうございます。

4

2 に答える 2

1

この方法でなんとか解決しました。これが完全な解決策です。これはヘッダーファイルにあります

typedef enum levels_tag levels_e;
enum levels_tag {
  LOG_UNKNOWN = 0,
  LOG_DEFAULT,
  LOG_VERBOSE,
  LOG_DEBUG,
  LOG_INFO,
  LOG_WARN,
  LOG_ERROR,
  LOG_FATAL,
  LOG_SILENT,
  LOG_LAST
};

/* ANDRIOD IMPLEMENTATION */
#if defined( __ARM_EABI__)
#include <android/log.h>

levels_e levels[LOG_LAST] = {LOG_UNKNOWN,
                             LOG_DEFAULT,
                             LOG_VERBOSE,
                             LOG_DEBUG,
                             LOG_INFO,
                             LOG_WARN,
                             LOG_ERROR,
                             LOG_FATAL,
                             LOG_SILENT};

#define LOG_TAG "MODULE_LOG_SIP"

#define LOGGING(PRIORITY, fmt, ...)  __android_log_print(levels[PRIORITY], LOG_TAG, fmt, ##__VA_ARGS__)

/* LINUX IMPLEMENTATION */
#elif defined(linux) || defined(__linux) || defined(__linux__)

char *priority_levels[] = {"UNKNOWN",
                           "DEFAULT",
                           "VERBOSE",
                           "DEBUG",
                           "INFO",
                           "WARN",
                           "ERROR",
                           "FATAL",
                           "SILENT",
                           NULL };

#define LOGGING(PRIORITY, fmt, ...)                                     \
    do {                                                                \
        char *priority = priority_levels[PRIORITY];                     \
        printf("%s/%s:%d [%s] " fmt " \n", __FILE__, __func__, __LINE__, priority, ##__VA_ARGS__); \
    } while(0)

#endif

#define LOG(PRIORITY, fmt, ...) LOGGING(PRIORITY, fmt, ##__VA_ARGS__)

ソース ファイルでは、次のように LOG マクロを呼び出すだけです。

LOG(LOG_FATAL, "Failed to create and initialize application instance [ %d ]", errno);

Linux でコンパイルする場合は、printf ステートメントを使用します。Android でコンパイルする場合は、__android_log_print ステートメントを使用します。どちらも同じフォーマットの出力を生成します。

これが他の誰かに役立つことを願っています。

于 2013-11-20T09:49:11.817 に答える
0

syslog() 関数のファミリーを使用して、stdout/stderr の代わりにシステム ログに出力することもできます (syslog.h を参照)。

void openlog(const char *ident, int option, int facility);
void syslog(int priority, const char *format, ...);
void closelog(void);

ログは /var/log で表示できます (ファイルは syslog のオプションに依存します。デフォルトでは、多くのシステム ログはファイル「messages」にあります)。場合によっては、この方法が stdout/stderr よりも優れていますが、openlog/closelog を使用する必要があります。残念ながら、syslog の優先度は android の優先度とは異なるため、透過的な優先度で単純なマクロ定義を行うことはできません。
Syslog の優先度:

#define LOG_EMERG   0   /* system is unusable */
#define LOG_ALERT   1   /* action must be taken immediately */
#define LOG_CRIT    2   /* critical conditions */
#define LOG_ERR     3   /* error conditions */
#define LOG_WARNING 4   /* warning conditions */
#define LOG_NOTICE  5   /* normal but significant condition */
#define LOG_INFO    6   /* informational */
#define LOG_DEBUG   7   /* debug-level messages */

Android ログの優先度:

/*
 * Android log priority values, in ascending priority order.
 */
typedef enum android_LogPriority {
    ANDROID_LOG_UNKNOWN = 0,
    ANDROID_LOG_DEFAULT,    /* only for SetMinPriority() */
    ANDROID_LOG_VERBOSE,
    ANDROID_LOG_DEBUG,
    ANDROID_LOG_INFO,
    ANDROID_LOG_WARN,
    ANDROID_LOG_ERROR,
    ANDROID_LOG_FATAL,
    ANDROID_LOG_SILENT,     /* only for SetMinPriority(); must be last */
} android_LogPriority;
于 2013-10-31T11:25:11.090 に答える