Allow custom metrics implementations on Android.
BUG=webrtc:6499
Review-Url: https://codereview.webrtc.org/2403463002
Cr-Commit-Position: refs/heads/master@{#15169}
diff --git a/webrtc/BUILD.gn b/webrtc/BUILD.gn
index 17e3c2a..cefe106 100644
--- a/webrtc/BUILD.gn
+++ b/webrtc/BUILD.gn
@@ -708,7 +708,6 @@
deps = [
"//base:base_java_test_support",
"//webrtc/api:libjingle_peerconnection_java",
- "//webrtc/api:libjingle_peerconnection_jni",
"//webrtc/examples:AppRTCMobile_javalib",
]
}
diff --git a/webrtc/api/BUILD.gn b/webrtc/api/BUILD.gn
index 01aacb7..ee64e60 100644
--- a/webrtc/api/BUILD.gn
+++ b/webrtc/api/BUILD.gn
@@ -171,12 +171,12 @@
rtc_static_library("libjingle_peerconnection_jni") {
sources = [
+ "android/jni/androidhistogram_jni.cc",
"android/jni/androidmediacodeccommon.h",
"android/jni/androidmediadecoder_jni.cc",
"android/jni/androidmediadecoder_jni.h",
"android/jni/androidmediaencoder_jni.cc",
"android/jni/androidmediaencoder_jni.h",
- "android/jni/androidmetrics_jni.cc",
"android/jni/androidnetworkmonitor_jni.cc",
"android/jni/androidnetworkmonitor_jni.h",
"android/jni/androidvideotracksource_jni.cc",
@@ -215,8 +215,6 @@
deps = [
":libjingle_peerconnection",
- "../system_wrappers:field_trial_default",
- "../system_wrappers:metrics_default",
]
if (rtc_build_libyuv) {
@@ -230,6 +228,20 @@
}
}
+ rtc_static_library("libjingle_peerconnection_metrics_default_jni") {
+ sources = [
+ "android/jni/androidmetrics_jni.cc",
+ ]
+
+ configs += [ ":libjingle_peerconnection_jni_warnings_config" ]
+
+ deps = [
+ ":libjingle_peerconnection",
+ "../system_wrappers:field_trial_default",
+ "../system_wrappers:metrics_default",
+ ]
+ }
+
rtc_shared_library("libjingle_peerconnection_so") {
sources = [
"android/jni/jni_onload.cc",
@@ -240,6 +252,7 @@
deps = [
":libjingle_peerconnection",
":libjingle_peerconnection_jni",
+ ":libjingle_peerconnection_metrics_default_jni",
]
output_extension = "so"
}
@@ -279,6 +292,7 @@
"android/java/src/org/webrtc/GlShader.java",
"android/java/src/org/webrtc/GlTextureFrameBuffer.java",
"android/java/src/org/webrtc/GlUtil.java",
+ "android/java/src/org/webrtc/Histogram.java",
"android/java/src/org/webrtc/IceCandidate.java",
"android/java/src/org/webrtc/MediaCodecVideoDecoder.java",
"android/java/src/org/webrtc/MediaCodecVideoEncoder.java",
@@ -286,7 +300,6 @@
"android/java/src/org/webrtc/MediaSource.java",
"android/java/src/org/webrtc/MediaStream.java",
"android/java/src/org/webrtc/MediaStreamTrack.java",
- "android/java/src/org/webrtc/Metrics.java",
"android/java/src/org/webrtc/NetworkMonitor.java",
"android/java/src/org/webrtc/NetworkMonitorAutoDetect.java",
"android/java/src/org/webrtc/PeerConnection.java",
@@ -316,6 +329,14 @@
"../base:base_java",
]
}
+
+ android_library("libjingle_peerconnection_metrics_default_java") {
+ java_files = [ "android/java/src/org/webrtc/Metrics.java" ]
+
+ deps = [
+ "//webrtc/base:base_java",
+ ]
+ }
}
rtc_source_set("rtc_stats_api") {
@@ -485,6 +506,7 @@
deps = [
":libjingle_peerconnection_java",
+ ":libjingle_peerconnection_metrics_default_java",
"../base:base_java",
"//base:base_java",
]
diff --git a/webrtc/api/android/java/src/org/webrtc/Camera1Session.java b/webrtc/api/android/java/src/org/webrtc/Camera1Session.java
index 6ff9c8a..8f29886 100644
--- a/webrtc/api/android/java/src/org/webrtc/Camera1Session.java
+++ b/webrtc/api/android/java/src/org/webrtc/Camera1Session.java
@@ -20,7 +20,6 @@
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.webrtc.CameraEnumerationAndroid.CaptureFormat;
-import org.webrtc.Metrics.Histogram;
@SuppressWarnings("deprecation")
public class Camera1Session implements CameraSession {
diff --git a/webrtc/api/android/java/src/org/webrtc/Camera2Session.java b/webrtc/api/android/java/src/org/webrtc/Camera2Session.java
index 3734860..2552b24 100644
--- a/webrtc/api/android/java/src/org/webrtc/Camera2Session.java
+++ b/webrtc/api/android/java/src/org/webrtc/Camera2Session.java
@@ -29,7 +29,6 @@
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.webrtc.CameraEnumerationAndroid.CaptureFormat;
-import org.webrtc.Metrics.Histogram;
@TargetApi(21)
public class Camera2Session implements CameraSession {
diff --git a/webrtc/api/android/java/src/org/webrtc/CameraEnumerationAndroid.java b/webrtc/api/android/java/src/org/webrtc/CameraEnumerationAndroid.java
index c5cdcf7d..de2b919 100644
--- a/webrtc/api/android/java/src/org/webrtc/CameraEnumerationAndroid.java
+++ b/webrtc/api/android/java/src/org/webrtc/CameraEnumerationAndroid.java
@@ -18,7 +18,6 @@
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
-import org.webrtc.Metrics.Histogram;
@SuppressWarnings("deprecation")
public class CameraEnumerationAndroid {
diff --git a/webrtc/api/android/java/src/org/webrtc/Histogram.java b/webrtc/api/android/java/src/org/webrtc/Histogram.java
new file mode 100644
index 0000000..8779861
--- /dev/null
+++ b/webrtc/api/android/java/src/org/webrtc/Histogram.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2016 The WebRTC project authors. All Rights Reserved.
+ *
+ * Use of this source code is governed by a BSD-style license
+ * that can be found in the LICENSE file in the root of the source
+ * tree. An additional intellectual property rights grant can be found
+ * in the file PATENTS. All contributing project authors may
+ * be found in the AUTHORS file in the root of the source tree.
+ */
+
+package org.webrtc;
+
+/**
+ * Class for holding the native pointer of a histogram. Since there is no way to destroy a
+ * histogram, please don't create unnecessary instances of this object. This class is thread safe.
+ *
+ * Usage example:
+ * private static final Histogram someMetricHistogram =
+ * Histogram.createCounts("WebRTC.Video.SomeMetric", 1, 10000, 50);
+ * someMetricHistogram.addSample(someVariable);
+ */
+class Histogram {
+ private final long handle;
+
+ private Histogram(long handle) {
+ this.handle = handle;
+ }
+
+ static public Histogram createCounts(String name, int min, int max, int bucketCount) {
+ return new Histogram(nativeCreateCounts(name, min, max, bucketCount));
+ }
+
+ static public Histogram createEnumeration(String name, int max) {
+ return new Histogram(nativeCreateEnumeration(name, max));
+ }
+
+ public void addSample(int sample) {
+ nativeAddSample(handle, sample);
+ }
+
+ private static native long nativeCreateCounts(String name, int min, int max, int bucketCount);
+ private static native long nativeCreateEnumeration(String name, int max);
+ private static native void nativeAddSample(long handle, int sample);
+}
diff --git a/webrtc/api/android/java/src/org/webrtc/Metrics.java b/webrtc/api/android/java/src/org/webrtc/Metrics.java
index 7d715fb..ca19489 100644
--- a/webrtc/api/android/java/src/org/webrtc/Metrics.java
+++ b/webrtc/api/android/java/src/org/webrtc/Metrics.java
@@ -59,41 +59,6 @@
}
}
- /**
- * Class for holding the native pointer of a histogram. Since there is no way to destroy a
- * histogram, please don't create unnecessary instances of this object. This class is thread safe.
- *
- * Usage example:
- * private static final Histogram someMetricHistogram =
- * Histogram.createCounts("WebRTC.Video.SomeMetric", 1, 10000, 50);
- * someMetricHistogram.addSample(someVariable);
- */
- static class Histogram {
- private final long handle;
- private final String name; // Only used for logging.
-
- private Histogram(long handle, String name) {
- this.handle = handle;
- this.name = name;
- }
-
- static public Histogram createCounts(String name, int min, int max, int bucketCount) {
- return new Histogram(nativeCreateCounts(name, min, max, bucketCount), name);
- }
-
- static public Histogram createEnumeration(String name, int max) {
- return new Histogram(nativeCreateEnumeration(name, max), name);
- }
-
- public void addSample(int sample) {
- nativeAddSample(handle, sample);
- }
-
- private static native long nativeCreateCounts(String name, int min, int max, int bucketCount);
- private static native long nativeCreateEnumeration(String name, int max);
- private static native void nativeAddSample(long handle, int sample);
- }
-
private void add(String name, HistogramInfo info) {
map.put(name, info);
}
diff --git a/webrtc/api/android/java/src/org/webrtc/OWNERS b/webrtc/api/android/java/src/org/webrtc/OWNERS
index 38f3f6f..e6ccc2d 100644
--- a/webrtc/api/android/java/src/org/webrtc/OWNERS
+++ b/webrtc/api/android/java/src/org/webrtc/OWNERS
@@ -1,2 +1,3 @@
per-file Camera*=sakal@webrtc.org
+per-file Histogram.java=sakal@webrtc.org
per-file Metrics.java=sakal@webrtc.org
diff --git a/webrtc/api/android/java/src/org/webrtc/VideoCapturerAndroid.java b/webrtc/api/android/java/src/org/webrtc/VideoCapturerAndroid.java
index 08c5c13..da32eb5 100644
--- a/webrtc/api/android/java/src/org/webrtc/VideoCapturerAndroid.java
+++ b/webrtc/api/android/java/src/org/webrtc/VideoCapturerAndroid.java
@@ -24,7 +24,6 @@
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import org.webrtc.CameraEnumerationAndroid.CaptureFormat;
-import org.webrtc.Metrics.Histogram;
// Android specific implementation of VideoCapturer.
// An instance of this class can be created by an application using
diff --git a/webrtc/api/android/jni/OWNERS b/webrtc/api/android/jni/OWNERS
index 96da1b9..4da3451 100644
--- a/webrtc/api/android/jni/OWNERS
+++ b/webrtc/api/android/jni/OWNERS
@@ -1,2 +1,3 @@
+per-file androidhistogram_jni.cc=sakal@webrtc.org
per-file androidmetrics_jni.cc=sakal@webrtc.org
per-file androidvideotracksource_jni.cc=sakal@webrtc.org
diff --git a/webrtc/api/android/jni/androidhistogram_jni.cc b/webrtc/api/android/jni/androidhistogram_jni.cc
new file mode 100644
index 0000000..9ccd2b7
--- /dev/null
+++ b/webrtc/api/android/jni/androidhistogram_jni.cc
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2016 The WebRTC project authors. All Rights Reserved.
+ *
+ * Use of this source code is governed by a BSD-style license
+ * that can be found in the LICENSE file in the root of the source
+ * tree. An additional intellectual property rights grant can be found
+ * in the file PATENTS. All contributing project authors may
+ * be found in the AUTHORS file in the root of the source tree.
+ */
+
+#include <map>
+#include <memory>
+
+#include "webrtc/api/android/jni/classreferenceholder.h"
+#include "webrtc/api/android/jni/jni_helpers.h"
+#include "webrtc/api/android/jni/native_handle_impl.h"
+#include "webrtc/system_wrappers/include/metrics.h"
+
+// Enables collection of native histograms and creating them.
+namespace webrtc_jni {
+
+JOW(jlong, Histogram_nativeCreateCounts)
+(JNIEnv* jni, jclass, jstring j_name, jint min, jint max, jint buckets) {
+ std::string name = JavaToStdString(jni, j_name);
+ return jlongFromPointer(
+ webrtc::metrics::HistogramFactoryGetCounts(name, min, max, buckets));
+}
+
+JOW(jlong, Histogram_nativeCreateEnumeration)
+(JNIEnv* jni, jclass, jstring j_name, jint max) {
+ std::string name = JavaToStdString(jni, j_name);
+ return jlongFromPointer(
+ webrtc::metrics::HistogramFactoryGetEnumeration(name, max));
+}
+
+JOW(void, Histogram_nativeAddSample)
+(JNIEnv* jni, jclass, jlong histogram, jint sample) {
+ if (histogram) {
+ HistogramAdd(reinterpret_cast<webrtc::metrics::Histogram*>(histogram),
+ sample);
+ }
+}
+
+} // namespace webrtc_jni
diff --git a/webrtc/api/android/jni/androidmetrics_jni.cc b/webrtc/api/android/jni/androidmetrics_jni.cc
index f63e604..62efc1b 100644
--- a/webrtc/api/android/jni/androidmetrics_jni.cc
+++ b/webrtc/api/android/jni/androidmetrics_jni.cc
@@ -13,7 +13,6 @@
#include "webrtc/api/android/jni/classreferenceholder.h"
#include "webrtc/api/android/jni/jni_helpers.h"
-#include "webrtc/api/android/jni/native_handle_impl.h"
#include "webrtc/system_wrappers/include/metrics.h"
#include "webrtc/system_wrappers/include/metrics_default.h"
@@ -26,11 +25,11 @@
// Gets and clears native histograms.
JOW(jobject, Metrics_nativeGetAndReset)(JNIEnv* jni, jclass) {
- jclass j_metrics_class = FindClass(jni, "org/webrtc/Metrics");
+ jclass j_metrics_class = jni->FindClass("org/webrtc/Metrics");
jmethodID j_add =
GetMethodID(jni, j_metrics_class, "add",
"(Ljava/lang/String;Lorg/webrtc/Metrics$HistogramInfo;)V");
- jclass j_info_class = FindClass(jni, "org/webrtc/Metrics$HistogramInfo");
+ jclass j_info_class = jni->FindClass("org/webrtc/Metrics$HistogramInfo");
jmethodID j_add_sample = GetMethodID(jni, j_info_class, "addSample", "(II)V");
// Create |Metrics|.
@@ -59,26 +58,4 @@
return j_metrics;
}
-JOW(jlong, Metrics_00024Histogram_nativeCreateCounts)
-(JNIEnv* jni, jclass, jstring j_name, jint min, jint max, jint buckets) {
- std::string name = JavaToStdString(jni, j_name);
- return jlongFromPointer(
- webrtc::metrics::HistogramFactoryGetCounts(name, min, max, buckets));
-}
-
-JOW(jlong, Metrics_00024Histogram_nativeCreateEnumeration)
-(JNIEnv* jni, jclass, jstring j_name, jint max) {
- std::string name = JavaToStdString(jni, j_name);
- return jlongFromPointer(
- webrtc::metrics::HistogramFactoryGetEnumeration(name, max));
-}
-
-JOW(void, Metrics_00024Histogram_nativeAddSample)
-(JNIEnv* jni, jclass, jlong histogram, jint sample) {
- if (histogram) {
- HistogramAdd(reinterpret_cast<webrtc::metrics::Histogram*>(histogram),
- sample);
- }
-}
-
} // namespace webrtc_jni
diff --git a/webrtc/api/android/jni/classreferenceholder.cc b/webrtc/api/android/jni/classreferenceholder.cc
index bfc03a3..ee68112 100644
--- a/webrtc/api/android/jni/classreferenceholder.cc
+++ b/webrtc/api/android/jni/classreferenceholder.cc
@@ -69,8 +69,6 @@
LoadClass(jni, "org/webrtc/MediaSource$State");
LoadClass(jni, "org/webrtc/MediaStream");
LoadClass(jni, "org/webrtc/MediaStreamTrack$State");
- LoadClass(jni, "org/webrtc/Metrics");
- LoadClass(jni, "org/webrtc/Metrics$HistogramInfo");
LoadClass(jni, "org/webrtc/NetworkMonitor");
LoadClass(jni, "org/webrtc/NetworkMonitorAutoDetect$ConnectionType");
LoadClass(jni, "org/webrtc/NetworkMonitorAutoDetect$IPAddress");
diff --git a/webrtc/examples/BUILD.gn b/webrtc/examples/BUILD.gn
index 58ae8a4..d419d94 100644
--- a/webrtc/examples/BUILD.gn
+++ b/webrtc/examples/BUILD.gn
@@ -93,6 +93,7 @@
deps = [
":AppRTCMobile_resources",
"//webrtc/api:libjingle_peerconnection_java",
+ "//webrtc/api:libjingle_peerconnection_metrics_default_java",
"//webrtc/base:base_java",
"//webrtc/examples/androidapp/third_party/autobanh:autobanh_java",
]