From 986a79cf3d6882050da8a14dd5d3bab1765b3861 Mon Sep 17 00:00:00 2001 From: Magnus Jedvert Date: Sat, 18 Nov 2017 16:45:18 +0100 Subject: [PATCH] Android: Annotate and generate JNI code for Metrics.java MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bug: webrtc:8278 Change-Id: I54caee1acb483d7554afd6c0958f1929a78d6a56 Reviewed-on: https://webrtc-review.googlesource.com/22720 Commit-Queue: Magnus Jedvert Reviewed-by: Sami Kalliomäki Cr-Commit-Position: refs/heads/master@{#20753} --- sdk/android/BUILD.gn | 10 +++++++++ sdk/android/api/org/webrtc/Metrics.java | 22 ++++++++++++++++---- sdk/android/src/jni/androidmetrics_jni.cc | 25 ++++++++--------------- 3 files changed, 36 insertions(+), 21 deletions(-) diff --git a/sdk/android/BUILD.gn b/sdk/android/BUILD.gn index d977797fa5..ea5b4b497a 100644 --- a/sdk/android/BUILD.gn +++ b/sdk/android/BUILD.gn @@ -353,6 +353,14 @@ rtc_static_library("libjingle_peerconnection_jni") { ] } +generate_jni("generated_metrics_jni") { + sources = [ + "api/org/webrtc/Metrics.java", + ] + jni_package = "" + jni_generator_include = "//sdk/android/src/jni/jni_generator_helper.h" +} + rtc_static_library("libjingle_peerconnection_metrics_default_jni") { sources = [ "src/jni/androidmetrics_jni.cc", @@ -362,6 +370,7 @@ rtc_static_library("libjingle_peerconnection_metrics_default_jni") { deps = [ ":base_jni", + ":generated_metrics_jni", ":peerconnection_jni", "../../pc:peerconnection", "../../system_wrappers", @@ -550,6 +559,7 @@ rtc_android_library("libjingle_peerconnection_metrics_default_java") { java_files = [ "api/org/webrtc/Metrics.java" ] deps = [ + ":libjingle_peerconnection_java", "../../rtc_base:base_java", ] } diff --git a/sdk/android/api/org/webrtc/Metrics.java b/sdk/android/api/org/webrtc/Metrics.java index ca19489e89..30570671ef 100644 --- a/sdk/android/api/org/webrtc/Metrics.java +++ b/sdk/android/api/org/webrtc/Metrics.java @@ -54,11 +54,13 @@ public class Metrics { this.bucketCount = bucketCount; } + @CalledByNative("HistogramInfo") public void addSample(int value, int numEvents) { samples.put(value, numEvents); } } + @CalledByNative private void add(String name, HistogramInfo info) { map.put(name, info); } @@ -66,14 +68,26 @@ public class Metrics { // Enables gathering of metrics (which can be fetched with getAndReset()). // Must be called before PeerConnectionFactory is created. public static void enable() { - nativeEnable(); + enableNative(); } // Gets and clears native histograms. public static Metrics getAndReset() { - return nativeGetAndReset(); + return getAndResetNative(); } - private static native void nativeEnable(); - private static native Metrics nativeGetAndReset(); + // TODO(bugs.webrtc.org/8551) Remove. + @CalledByNative + static Metrics createMetrics() { + return new Metrics(); + } + + // TODO(bugs.webrtc.org/8551) Remove. + @CalledByNative + static HistogramInfo createHistogramInfo(int min, int max, int bucketCount) { + return new HistogramInfo(min, max, bucketCount); + } + + private static native void enableNative(); + private static native Metrics getAndResetNative(); } diff --git a/sdk/android/src/jni/androidmetrics_jni.cc b/sdk/android/src/jni/androidmetrics_jni.cc index cdcc2941bb..33e450ca0e 100644 --- a/sdk/android/src/jni/androidmetrics_jni.cc +++ b/sdk/android/src/jni/androidmetrics_jni.cc @@ -11,6 +11,7 @@ #include #include +#include "sdk/android/generated_metrics_jni/jni/Metrics_jni.h" #include "sdk/android/src/jni/classreferenceholder.h" #include "sdk/android/src/jni/jni_helpers.h" #include "system_wrappers/include/metrics.h" @@ -20,40 +21,30 @@ namespace webrtc { namespace jni { -JNI_FUNCTION_DECLARATION(void, Metrics_nativeEnable, JNIEnv* jni, jclass) { +JNI_FUNCTION_DECLARATION(void, Metrics_enableNative, JNIEnv* jni, jclass) { metrics::Enable(); } // Gets and clears native histograms. JNI_FUNCTION_DECLARATION(jobject, - Metrics_nativeGetAndReset, + Metrics_getAndResetNative, JNIEnv* jni, jclass) { - 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 = jni->FindClass("org/webrtc/Metrics$HistogramInfo"); - jmethodID j_add_sample = GetMethodID(jni, j_info_class, "addSample", "(II)V"); - - // Create |Metrics|. - jobject j_metrics = jni->NewObject( - j_metrics_class, GetMethodID(jni, j_metrics_class, "", "()V")); + jobject j_metrics = Java_Metrics_createMetrics(jni); std::map> histograms; metrics::GetAndReset(&histograms); for (const auto& kv : histograms) { // Create and add samples to |HistogramInfo|. - jobject j_info = jni->NewObject( - j_info_class, GetMethodID(jni, j_info_class, "", "(III)V"), - kv.second->min, kv.second->max, + jobject j_info = Java_Metrics_createHistogramInfo( + jni, kv.second->min, kv.second->max, static_cast(kv.second->bucket_count)); for (const auto& sample : kv.second->samples) { - jni->CallVoidMethod(j_info, j_add_sample, sample.first, sample.second); + Java_HistogramInfo_addSample(jni, j_info, sample.first, sample.second); } // Add |HistogramInfo| to |Metrics|. jstring j_name = jni->NewStringUTF(kv.first.c_str()); - jni->CallVoidMethod(j_metrics, j_add, j_name, j_info); + Java_Metrics_add(jni, j_metrics, j_name, j_info); jni->DeleteLocalRef(j_name); jni->DeleteLocalRef(j_info); }