diff --git a/webrtc/base/java/src/org/webrtc/Logging.java b/webrtc/base/java/src/org/webrtc/Logging.java index 736dcf0d43..64c405b52e 100644 --- a/webrtc/base/java/src/org/webrtc/Logging.java +++ b/webrtc/base/java/src/org/webrtc/Logging.java @@ -16,23 +16,40 @@ import java.util.EnumSet; import java.util.logging.Level; import java.util.logging.Logger; -/** Java wrapper for WebRTC logging. */ +/** + * Java wrapper for WebRTC logging. Logging defaults to java.util.logging.Logger, but will switch to + * native logging (rtc::LogMessage) if one of the following static functions are called from the + * app: + * - Logging.enableLogThreads + * - Logging.enableLogTimeStamps + * - Logging.enableTracing + * - Logging.enableLogToDebugOutput + * Using native logging requires the presence of the jingle_peerconnection_so library. + */ public class Logging { - private static final Logger fallbackLogger = Logger.getLogger("org.webrtc.Logging"); + private static final Logger fallbackLogger = createFallbackLogger(); private static volatile boolean tracingEnabled; private static volatile boolean loggingEnabled; - private static volatile boolean nativeLibLoaded; + private static enum NativeLibStatus { UNINITIALIZED, LOADED, FAILED } + private static volatile NativeLibStatus nativeLibStatus; - static { - try { - System.loadLibrary("jingle_peerconnection_so"); - nativeLibLoaded = true; - } catch (UnsatisfiedLinkError t) { - // If native logging is unavailable, log to system log. - fallbackLogger.setLevel(Level.ALL); + private static Logger createFallbackLogger() { + final Logger fallbackLogger = Logger.getLogger("org.webrtc.Logging"); + fallbackLogger.setLevel(Level.ALL); + return fallbackLogger; + } - fallbackLogger.log(Level.WARNING, "Failed to load jingle_peerconnection_so: ", t); + private static boolean loadNativeLibrary() { + if (nativeLibStatus == NativeLibStatus.UNINITIALIZED) { + try { + System.loadLibrary("jingle_peerconnection_so"); + nativeLibStatus = NativeLibStatus.LOADED; + } catch (UnsatisfiedLinkError t) { + nativeLibStatus = NativeLibStatus.FAILED; + fallbackLogger.log(Level.WARNING, "Failed to load jingle_peerconnection_so: ", t); + } } + return nativeLibStatus == NativeLibStatus.LOADED; } // Keep in sync with webrtc/common_types.h:TraceLevel. @@ -63,7 +80,7 @@ public class Logging { public enum Severity { LS_SENSITIVE, LS_VERBOSE, LS_INFO, LS_WARNING, LS_ERROR, LS_NONE } public static void enableLogThreads() { - if (!nativeLibLoaded) { + if (!loadNativeLibrary()) { fallbackLogger.log(Level.WARNING, "Cannot enable log thread because native lib not loaded."); return; } @@ -71,7 +88,7 @@ public class Logging { } public static void enableLogTimeStamps() { - if (!nativeLibLoaded) { + if (!loadNativeLibrary()) { fallbackLogger.log( Level.WARNING, "Cannot enable log timestamps because native lib not loaded."); return; @@ -83,7 +100,7 @@ public class Logging { // On Android, use "logcat:" for |path| to send output there. // Note: this function controls the output of the WEBRTC_TRACE() macros. public static synchronized void enableTracing(String path, EnumSet levels) { - if (!nativeLibLoaded) { + if (!loadNativeLibrary()) { fallbackLogger.log(Level.WARNING, "Cannot enable tracing because native lib not loaded."); return; } @@ -103,7 +120,7 @@ public class Logging { // output. On Android, the output will be directed to Logcat. // Note: this function starts collecting the output of the LOG() macros. public static synchronized void enableLogToDebugOutput(Severity severity) { - if (!nativeLibLoaded) { + if (!loadNativeLibrary()) { fallbackLogger.log(Level.WARNING, "Cannot enable logging because native lib not loaded."); return; } diff --git a/webrtc/sdk/android/api/org/webrtc/FileVideoCapturer.java b/webrtc/sdk/android/api/org/webrtc/FileVideoCapturer.java index a0552247c9..a71e9327ae 100644 --- a/webrtc/sdk/android/api/org/webrtc/FileVideoCapturer.java +++ b/webrtc/sdk/android/api/org/webrtc/FileVideoCapturer.java @@ -20,6 +20,10 @@ import java.io.RandomAccessFile; import java.io.IOException; public class FileVideoCapturer implements VideoCapturer { + static { + System.loadLibrary("jingle_peerconnection_so"); + } + private interface VideoReader { int getFrameWidth(); int getFrameHeight(); diff --git a/webrtc/sdk/android/api/org/webrtc/VideoFileRenderer.java b/webrtc/sdk/android/api/org/webrtc/VideoFileRenderer.java index 02a4a3fd0f..17676c0d82 100644 --- a/webrtc/sdk/android/api/org/webrtc/VideoFileRenderer.java +++ b/webrtc/sdk/android/api/org/webrtc/VideoFileRenderer.java @@ -22,6 +22,10 @@ import java.util.ArrayList; * Can be used to save the video frames to file. */ public class VideoFileRenderer implements VideoRenderer.Callbacks { + static { + System.loadLibrary("jingle_peerconnection_so"); + } + private static final String TAG = "VideoFileRenderer"; private final HandlerThread renderThread;