++
++#ifdef ANDROID
++extern "C" {
++static int sr_log_callback_android(void *cb_data, int loglevel, const char *format, va_list args)
++{
++ static const int prio[] = {
++ [SR_LOG_NONE] = ANDROID_LOG_SILENT,
++ [SR_LOG_ERR] = ANDROID_LOG_ERROR,
++ [SR_LOG_WARN] = ANDROID_LOG_WARN,
++ [SR_LOG_INFO] = ANDROID_LOG_INFO,
++ [SR_LOG_DBG] = ANDROID_LOG_DEBUG,
++ [SR_LOG_SPEW] = ANDROID_LOG_VERBOSE,
++ };
++ int ret;
++
++ /* This specific log callback doesn't need the void pointer data. */
++ (void)cb_data;
++
++ /* Only output messages of at least the selected loglevel(s). */
++ if (loglevel > sr_log_loglevel_get())
++ return SR_OK; /* TODO? */
++
++ if (loglevel < SR_LOG_NONE)
++ loglevel = SR_LOG_NONE;
++ else if (loglevel > SR_LOG_SPEW)
++ loglevel = SR_LOG_SPEW;
++
++ ret = __android_log_vprint(prio[loglevel], "sr", format, args);
++
++ return ret;
++}
++
++#ifdef ENABLE_DECODE
++static int srd_log_callback_android(void *cb_data, int loglevel, const char *format,
++ va_list args)
++{
++ static const int prio[] = {
++ [SRD_LOG_NONE] = ANDROID_LOG_SILENT,
++ [SRD_LOG_ERR] = ANDROID_LOG_ERROR,
++ [SRD_LOG_WARN] = ANDROID_LOG_WARN,
++ [SRD_LOG_INFO] = ANDROID_LOG_INFO,
++ [SRD_LOG_DBG] = ANDROID_LOG_DEBUG,
++ [SRD_LOG_SPEW] = ANDROID_LOG_VERBOSE,
++ };
++ int ret;
++
++ /* This specific log callback doesn't need the void pointer data. */
++ (void)cb_data;
++
++ /* Only output messages of at least the selected loglevel(s). */
++ if (loglevel > srd_log_loglevel_get())
++ return SRD_OK; /* TODO? */
++
++ if (loglevel < SRD_LOG_NONE)
++ loglevel = SRD_LOG_NONE;
++ else if (loglevel > SRD_LOG_SPEW)
++ loglevel = SRD_LOG_SPEW;
++
++ ret = __android_log_vprint(prio[loglevel], "srd", format, args);
++
++ return ret;
++}
++#endif
++}
++#endif