ndk_logger/
lib.rs

1extern crate log;
2
3mod ffi;
4
5use std::os::raw::{c_char, c_int};
6use log::{Level, Log, Metadata, Record, SetLoggerError};
7use ffi::android_LogPriority;
8
9pub struct Logger;
10
11impl Log for Logger {
12    fn enabled(&self, _metadata: &Metadata) -> bool {
13        true
14    }
15
16    fn log(&self, record: &Record) {
17        let prio = match record.level() {
18            Level::Error => android_LogPriority::ANDROID_LOG_ERROR,
19            Level::Warn => android_LogPriority::ANDROID_LOG_WARN,
20            Level::Info => android_LogPriority::ANDROID_LOG_INFO,
21            Level::Debug => android_LogPriority::ANDROID_LOG_DEBUG,
22            Level::Trace => android_LogPriority::ANDROID_LOG_VERBOSE,
23        };
24        let text = format!("{}", record.args());
25        let _ret = unsafe {
26            ffi::__android_log_write(
27                prio as c_int,
28                record.target().as_ptr() as *const c_char,
29                text.as_ptr() as *const c_char,
30            )
31        };
32    }
33
34    fn flush(&self) {}
35}
36
37pub fn init() -> Result<(), SetLoggerError> {
38    log::set_boxed_logger(Box::new(Logger {}))
39}