diff --git a/sdk/android/BUILD.gn b/sdk/android/BUILD.gn index c346563e76..967a3b40cf 100644 --- a/sdk/android/BUILD.gn +++ b/sdk/android/BUILD.gn @@ -282,6 +282,9 @@ generate_jni("generated_peerconnection_jni") { "api/org/webrtc/MediaConstraints.java", "api/org/webrtc/NetworkMonitor.java", "api/org/webrtc/NetworkMonitorAutoDetect.java", + "api/org/webrtc/RTCStats.java", + "api/org/webrtc/RTCStatsCollectorCallback.java", + "api/org/webrtc/RTCStatsReport.java", ] jni_package = "" jni_generator_include = "//sdk/android/src/jni/jni_generator_helper.h" diff --git a/sdk/android/api/org/webrtc/RTCStats.java b/sdk/android/api/org/webrtc/RTCStats.java index 7a73376049..7ad7634c82 100644 --- a/sdk/android/api/org/webrtc/RTCStats.java +++ b/sdk/android/api/org/webrtc/RTCStats.java @@ -103,4 +103,11 @@ public class RTCStats { builder.append(value); } } + + // TODO(bugs.webrtc.org/8557) Use ctor directly with full Map type. + @SuppressWarnings("unchecked") + @CalledByNative + static RTCStats create(long timestampUs, String type, String id, Map members) { + return new RTCStats(timestampUs, type, id, members); + } } diff --git a/sdk/android/api/org/webrtc/RTCStatsCollectorCallback.java b/sdk/android/api/org/webrtc/RTCStatsCollectorCallback.java index 027c1587df..dc8902c93c 100644 --- a/sdk/android/api/org/webrtc/RTCStatsCollectorCallback.java +++ b/sdk/android/api/org/webrtc/RTCStatsCollectorCallback.java @@ -13,5 +13,5 @@ package org.webrtc; /** Interface for receiving stats reports (see webrtc::RTCStatsCollectorCallback). */ public interface RTCStatsCollectorCallback { /** Called when the stats report is ready. */ - public void onStatsDelivered(RTCStatsReport report); + @CalledByNative public void onStatsDelivered(RTCStatsReport report); } diff --git a/sdk/android/api/org/webrtc/RTCStatsReport.java b/sdk/android/api/org/webrtc/RTCStatsReport.java index d4a9784ea8..d4d90db1a6 100644 --- a/sdk/android/api/org/webrtc/RTCStatsReport.java +++ b/sdk/android/api/org/webrtc/RTCStatsReport.java @@ -52,4 +52,11 @@ public class RTCStatsReport { builder.append(" ] }"); return builder.toString(); } + + // TODO(bugs.webrtc.org/8557) Use ctor directly with full Map type. + @SuppressWarnings("unchecked") + @CalledByNative + private static RTCStatsReport create(long timestampUs, Map stats) { + return new RTCStatsReport(timestampUs, stats); + } } diff --git a/sdk/android/src/jni/pc/rtcstatscollectorcallbackwrapper.cc b/sdk/android/src/jni/pc/rtcstatscollectorcallbackwrapper.cc index e7e649535b..2e892e5333 100644 --- a/sdk/android/src/jni/pc/rtcstatscollectorcallbackwrapper.cc +++ b/sdk/android/src/jni/pc/rtcstatscollectorcallbackwrapper.cc @@ -13,6 +13,9 @@ #include #include +#include "sdk/android/generated_peerconnection_jni/jni/RTCStatsCollectorCallback_jni.h" +#include "sdk/android/generated_peerconnection_jni/jni/RTCStatsReport_jni.h" +#include "sdk/android/generated_peerconnection_jni/jni/RTCStats_jni.h" #include "sdk/android/src/jni/classreferenceholder.h" namespace webrtc { @@ -23,17 +26,6 @@ RTCStatsCollectorCallbackWrapper::RTCStatsCollectorCallbackWrapper( jobject j_callback) : j_callback_global_(jni, j_callback), j_callback_class_(jni, GetObjectClass(jni, j_callback)), - j_stats_report_class_(FindClass(jni, "org/webrtc/RTCStatsReport")), - j_stats_report_ctor_(GetMethodID(jni, - j_stats_report_class_, - "", - "(JLjava/util/Map;)V")), - j_stats_class_(FindClass(jni, "org/webrtc/RTCStats")), - j_stats_ctor_(GetMethodID( - jni, - j_stats_class_, - "", - "(JLjava/lang/String;Ljava/lang/String;Ljava/util/Map;)V")), j_linked_hash_map_class_(FindClass(jni, "java/util/LinkedHashMap")), j_linked_hash_map_ctor_( GetMethodID(jni, j_linked_hash_map_class_, "", "()V")), @@ -61,10 +53,8 @@ void RTCStatsCollectorCallbackWrapper::OnStatsDelivered( JNIEnv* jni = AttachCurrentThreadIfNeeded(); ScopedLocalRefFrame local_ref_frame(jni); jobject j_report = ReportToJava(jni, report); - jmethodID m = GetMethodID(jni, *j_callback_class_, "onStatsDelivered", - "(Lorg/webrtc/RTCStatsReport;)V"); - jni->CallVoidMethod(*j_callback_global_, m, j_report); - CHECK_EXCEPTION(jni) << "error during CallVoidMethod"; + Java_RTCStatsCollectorCallback_onStatsDelivered(jni, *j_callback_global_, + j_report); } jobject RTCStatsCollectorCallbackWrapper::ReportToJava( @@ -82,9 +72,8 @@ jobject RTCStatsCollectorCallbackWrapper::ReportToJava( jni->CallObjectMethod(j_stats_map, j_linked_hash_map_put_, j_id, j_stats); CHECK_EXCEPTION(jni) << "error during CallObjectMethod"; } - jobject j_report = jni->NewObject(j_stats_report_class_, j_stats_report_ctor_, - report->timestamp_us(), j_stats_map); - CHECK_EXCEPTION(jni) << "error during NewObject"; + jobject j_report = + Java_RTCStatsReport_create(jni, report->timestamp_us(), j_stats_map); return j_report; } @@ -106,8 +95,7 @@ jobject RTCStatsCollectorCallbackWrapper::StatsToJava(JNIEnv* jni, CHECK_EXCEPTION(jni) << "error during CallObjectMethod"; } jobject j_stats = - jni->NewObject(j_stats_class_, j_stats_ctor_, stats.timestamp_us(), - j_type, j_id, j_members); + Java_RTCStats_create(jni, stats.timestamp_us(), j_type, j_id, j_members); CHECK_EXCEPTION(jni) << "error during NewObject"; return j_stats; } diff --git a/sdk/android/src/jni/pc/rtcstatscollectorcallbackwrapper.h b/sdk/android/src/jni/pc/rtcstatscollectorcallbackwrapper.h index e3b56df477..8914a5d56d 100644 --- a/sdk/android/src/jni/pc/rtcstatscollectorcallbackwrapper.h +++ b/sdk/android/src/jni/pc/rtcstatscollectorcallbackwrapper.h @@ -38,10 +38,6 @@ class RTCStatsCollectorCallbackWrapper : public RTCStatsCollectorCallback { const ScopedGlobalRef j_callback_global_; const ScopedGlobalRef j_callback_class_; - const jclass j_stats_report_class_; - const jmethodID j_stats_report_ctor_; - const jclass j_stats_class_; - const jmethodID j_stats_ctor_; const jclass j_linked_hash_map_class_; const jmethodID j_linked_hash_map_ctor_; const jmethodID j_linked_hash_map_put_;