21 #include "JNIHelper.h"
26 namespace com {
namespace avpkit {
namespace ferry {
27 bool Logger :: mInitialized =
false;
28 bool Logger :: mGlobalIsLogging[5] = {
true,
true,
true,
true,
true };
29 jclass Logger :: mClass = 0;
30 jmethodID Logger :: mGetLoggerMethod = 0;
31 jmethodID Logger :: mLogMethod = 0;
33 Mutex* Logger :: mClassMutex = 0;
40 int formatMsg(
char * msgBuf,
int bufLen,
41 const char *aFilename,
int lineNo,
42 const char *aFormat, va_list ap)
45 if (msgBuf && bufLen > 0) {
47 if (aFormat && *aFormat)
49 bytesWritten += vsnprintf(msgBuf, bufLen, aFormat, ap);
51 if (aFilename && *aFilename) {
52 bufLen -= bytesWritten;
53 msgBuf += bytesWritten;
55 bytesWritten += snprintf(msgBuf, bufLen,
" (%s:%d)",
62 Logger :: Logger(
const char* loggerName, jobject javaLogger)
65 for(
unsigned int i =0 ; i<
sizeof(mIsLogging)/
sizeof(
bool); i++)
68 strncpy(mLoggerName, loggerName,
sizeof(mLoggerName));
71 JNIEnv *env=JNIHelper::sGetEnv();
72 if (env && javaLogger)
74 mJavaLogger = env->NewGlobalRef(javaLogger);
80 JNIEnv *env=JNIHelper::sGetEnv();
84 env->DeleteGlobalRef(mJavaLogger);
94 JNIHelper::sRegisterInitializationCallback(initJavaBindings,0);
101 Logger :: initJavaBindings(JavaVM*,
void*)
103 JNIEnv *env=JNIHelper::sGetEnv();
107 jclass cls=env->FindClass(
"com/avpkit/ferry/NativeLogger");
112 mGetLoggerMethod = env->GetStaticMethodID(cls,
114 "(Ljava/lang/String;)Lcom/avpkit/ferry/NativeLogger;"
116 mLogMethod = env->GetMethodID(cls,
118 "(ILjava/lang/String;)Z"
122 mClass = (jclass)env->NewWeakGlobalRef(cls);
125 mClassMutex = Mutex::make();
131 Logger :: shutdownJavaBindings(JavaVM* vm,
void*closure)
133 Logger* pLogger = (Logger*)closure;
147 if (loggerName && *loggerName)
149 if (mGetLoggerMethod)
151 JNIEnv *env=JNIHelper::sGetEnv();
154 jobject javaLogger = 0;
155 jstring jLoggerName = env->NewStringUTF(loggerName);
157 javaLogger = env->CallStaticObjectMethod(mClass,
158 mGetLoggerMethod, jLoggerName);
159 env->DeleteLocalRef(jLoggerName);
162 retval =
new Logger(loggerName, javaLogger);
165 env->DeleteLocalRef(javaLogger);
169 retval =
new Logger(loggerName, 0);
186 JNIHelper::sRegisterTerminationCallback(Logger::shutdownJavaBindings,
193 Logger :: setIsLogging(Level level,
bool value)
195 mIsLogging[level] = value;
199 Logger :: setGlobalIsLogging(Level level,
bool value)
201 mGlobalIsLogging[level] = value;
205 Logger :: doLog(Level level,
const char *msg)
208 if (mGlobalIsLogging[level] && mIsLogging[level])
212 didLog = this->doJavaLog(level, msg);
214 didLog = this->doNativeLog(level, msg);
221 mIsLogging[level] = didLog;
227 Logger :: doNativeLog(Level level,
const char *msg)
230 const char * levelStr =
"";
254 if (didLog && msg && *msg)
256 std::cerr << levelStr << mLoggerName
258 int len = strlen(msg);
259 if (msg[len-1] !=
'\n')
266 Logger :: isLogging(Level level)
268 return mGlobalIsLogging[level] && mIsLogging[level];
272 Logger :: isGlobalLogging(Level level)
274 return mGlobalIsLogging[level];
284 Logger :: doJavaLog(Level level,
const char* msg)
287 JNIEnv *env=JNIHelper::sGetEnv();
290 if (!mJavaLogger && mClassMutex)
303 mJavaLogger = jlogger->mJavaLogger;
304 jlogger->mJavaLogger = 0;
309 mClassMutex->unlock();
313 jstring javaMsg = env->NewStringUTF(msg);
314 retval = env->CallBooleanMethod(mJavaLogger,
315 mLogMethod, (
int)level, javaMsg);
316 env->DeleteLocalRef(javaMsg);
330 didLog = this->logVA(filename, line, level, fmt, ap);
336 Logger :: logVA(
const char* filename,
int line, Level level,
const char *fmt, va_list ap)
339 if (mGlobalIsLogging[level] && mIsLogging[level])
341 char msg[cMaxLogMessageLength+1];
342 formatMsg(msg,
sizeof(msg), filename, line, fmt, ap);
343 didLog = this->doLog(level, msg);
348 #define VS_LOGGER_CONVENIENCE_METHOD(__FUNCNAME, __LEVEL) \
350 Logger :: __FUNCNAME(const char* filename, int line, const char * fmt, ...) \
352 Level level = __LEVEL; \
353 bool didLog = false; \
356 if (mGlobalIsLogging[level] && mIsLogging[level]) \
358 char msg[cMaxLogMessageLength+1]; \
359 formatMsg(msg, sizeof(msg), filename, line, fmt, ap); \
360 didLog = this->doLog(level, msg); \
365 VS_LOGGER_CONVENIENCE_METHOD(error, LEVEL_ERROR)
366 VS_LOGGER_CONVENIENCE_METHOD(warn, LEVEL_WARN)
367 VS_LOGGER_CONVENIENCE_METHOD(info, LEVEL_INFO)
368 VS_LOGGER_CONVENIENCE_METHOD(debug, LEVEL_DEBUG)
369 VS_LOGGER_CONVENIENCE_METHOD(trace, LEVEL_TRACE)
static Logger * getStaticLogger(const char *aLoggerName)
Get a Logger object, but ask the Logger code to free it up once the JavaVM shuts down.
Level
Different logging levels (noiseness) supported by us.
bool log(const char *filename, int lineNo, Level level, const char *format,...)
Log the message to the logger, using sprintf() format strings.
static Logger * getLogger(const char *aLoggerName)
Returns a new Logger object for this loggerName.
WARNING: Do not use logging in this class, and do not set any static file variables to values other t...