Android: Generate JNI code for RTCStats

Bug: webrtc:8278
Change-Id: I183cec54ec3e97894db7f26e365eb9941a1ab458
Reviewed-on: https://webrtc-review.googlesource.com/25660
Commit-Queue: Magnus Jedvert <magjed@webrtc.org>
Reviewed-by: Sami Kalliomäki <sakal@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#20879}
diff --git a/sdk/android/BUILD.gn b/sdk/android/BUILD.gn
index c346563..967a3b4 100644
--- a/sdk/android/BUILD.gn
+++ b/sdk/android/BUILD.gn
@@ -282,6 +282,9 @@
     "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 7a73376..7ad7634 100644
--- a/sdk/android/api/org/webrtc/RTCStats.java
+++ b/sdk/android/api/org/webrtc/RTCStats.java
@@ -103,4 +103,11 @@
       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 027c158..dc8902c 100644
--- a/sdk/android/api/org/webrtc/RTCStatsCollectorCallback.java
+++ b/sdk/android/api/org/webrtc/RTCStatsCollectorCallback.java
@@ -13,5 +13,5 @@
 /** 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 d4a9784..d4d90db 100644
--- a/sdk/android/api/org/webrtc/RTCStatsReport.java
+++ b/sdk/android/api/org/webrtc/RTCStatsReport.java
@@ -52,4 +52,11 @@
     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 e7e6495..2e892e5 100644
--- a/sdk/android/src/jni/pc/rtcstatscollectorcallbackwrapper.cc
+++ b/sdk/android/src/jni/pc/rtcstatscollectorcallbackwrapper.cc
@@ -13,6 +13,9 @@
 #include <string>
 #include <vector>
 
+#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 @@
     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_,
-                                       "<init>",
-                                       "(JLjava/util/Map;)V")),
-      j_stats_class_(FindClass(jni, "org/webrtc/RTCStats")),
-      j_stats_ctor_(GetMethodID(
-          jni,
-          j_stats_class_,
-          "<init>",
-          "(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_, "<init>", "()V")),
@@ -61,10 +53,8 @@
   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 @@
     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 @@
     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 e3b56df..8914a5d 100644
--- a/sdk/android/src/jni/pc/rtcstatscollectorcallbackwrapper.h
+++ b/sdk/android/src/jni/pc/rtcstatscollectorcallbackwrapper.h
@@ -38,10 +38,6 @@
 
   const ScopedGlobalRef<jobject> j_callback_global_;
   const ScopedGlobalRef<jclass> 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_;