Reland "Android: Generate JNI code for VideoSink and VideoEncoder"

This is a reland of ba78b5a905bffa05933a135673996df02328f2a4
Original change's description:
> Android: Generate JNI code for VideoSink and VideoEncoder
> 
> This is the first CL to start generating JNI code. It has updated two of
> the most recent classes to use JNI code generation.
> 
> Bug: webrtc:8278
> Change-Id: I1b19ee78c273346ceeaa0401dbdf8696803f16c7
> Reviewed-on: https://webrtc-review.googlesource.com/3820
> Reviewed-by: Sami Kalliomäki <sakal@webrtc.org>
> Commit-Queue: Magnus Jedvert <magjed@webrtc.org>
> Cr-Commit-Position: refs/heads/master@{#19994}

Bug: webrtc:8278
Change-Id: Id3e6513736eb87d7c234be3b0d13c5d30435201c
Reviewed-on: https://webrtc-review.googlesource.com/4500
Reviewed-by: Magnus Jedvert <magjed@webrtc.org>
Reviewed-by: Sami Kalliomäki <sakal@webrtc.org>
Commit-Queue: Magnus Jedvert <magjed@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#20548}
diff --git a/sdk/android/BUILD.gn b/sdk/android/BUILD.gn
index d8781a6..8d3d587 100644
--- a/sdk/android/BUILD.gn
+++ b/sdk/android/BUILD.gn
@@ -90,6 +90,15 @@
   ]
 }
 
+generate_jni("generated_video_jni") {
+  sources = [
+    "api/org/webrtc/VideoEncoder.java",
+    "api/org/webrtc/VideoSink.java",
+  ]
+  jni_package = ""
+  jni_generator_include = "//sdk/android/src/jni/jni_generator_helper.h"
+}
+
 rtc_static_library("video_jni") {
   sources = [
     "src/jni/androidmediacodeccommon.h",
@@ -100,6 +109,7 @@
     "src/jni/androidvideotracksource.cc",
     "src/jni/androidvideotracksource.h",
     "src/jni/androidvideotracksource_jni.cc",
+    "src/jni/jni_generator_helper.h",
     "src/jni/native_handle_impl.cc",
     "src/jni/native_handle_impl.h",
     "src/jni/nv12buffer_jni.cc",
@@ -145,6 +155,7 @@
 
   deps = [
     ":base_jni",
+    ":generated_video_jni",
     ":peerconnection_jni",
     "../..:webrtc_common",
     "../../api:libjingle_peerconnection_api",
diff --git a/sdk/android/api/org/webrtc/VideoEncoder.java b/sdk/android/api/org/webrtc/VideoEncoder.java
index 2708846..30bfaaf 100644
--- a/sdk/android/api/org/webrtc/VideoEncoder.java
+++ b/sdk/android/api/org/webrtc/VideoEncoder.java
@@ -124,29 +124,35 @@
   /**
    * Initializes the encoding process. Call before any calls to encode.
    */
-  VideoCodecStatus initEncode(Settings settings, Callback encodeCallback);
+  @CalledByNative VideoCodecStatus initEncode(Settings settings, Callback encodeCallback);
+
   /**
    * Releases the encoder. No more calls to encode will be made after this call.
    */
-  VideoCodecStatus release();
+  @CalledByNative VideoCodecStatus release();
+
   /**
    * Requests the encoder to encode a frame.
    */
-  VideoCodecStatus encode(VideoFrame frame, EncodeInfo info);
+  @CalledByNative VideoCodecStatus encode(VideoFrame frame, EncodeInfo info);
+
   /**
    * Informs the encoder of the packet loss and the round-trip time of the network.
    *
    * @param packetLoss How many packets are lost on average per 255 packets.
    * @param roundTripTimeMs Round-trip time of the network in milliseconds.
    */
-  VideoCodecStatus setChannelParameters(short packetLoss, long roundTripTimeMs);
+  @CalledByNative VideoCodecStatus setChannelParameters(short packetLoss, long roundTripTimeMs);
+
   /** Sets the bitrate allocation and the target framerate for the encoder. */
-  VideoCodecStatus setRateAllocation(BitrateAllocation allocation, int framerate);
+  @CalledByNative VideoCodecStatus setRateAllocation(BitrateAllocation allocation, int framerate);
+
   /** Any encoder that wants to use WebRTC provided quality scaler must implement this method. */
-  ScalingSettings getScalingSettings();
+  @CalledByNative ScalingSettings getScalingSettings();
+
   /**
    * Should return a descriptive name for the implementation. Gets called once and cached. May be
    * called from arbitrary thread.
    */
-  String getImplementationName();
+  @CalledByNative String getImplementationName();
 }
diff --git a/sdk/android/api/org/webrtc/VideoSink.java b/sdk/android/api/org/webrtc/VideoSink.java
index e4162fe..5a0a6c7 100644
--- a/sdk/android/api/org/webrtc/VideoSink.java
+++ b/sdk/android/api/org/webrtc/VideoSink.java
@@ -19,5 +19,5 @@
    * this function returns. Each call to retain() should be followed by a call to frame.release()
    * when the reference is no longer needed.
    */
-  void onFrame(VideoFrame frame);
+  @CalledByNative void onFrame(VideoFrame frame);
 }
diff --git a/sdk/android/src/jni/jni_generator_helper.cc b/sdk/android/src/jni/jni_generator_helper.cc
index 3bc9b05..5a09523 100644
--- a/sdk/android/src/jni/jni_generator_helper.cc
+++ b/sdk/android/src/jni/jni_generator_helper.cc
@@ -11,6 +11,7 @@
 #include "sdk/android/src/jni/jni_generator_helper.h"
 
 #include "rtc_base/atomicops.h"
+#include "sdk/android/src/jni/classreferenceholder.h"
 
 namespace base {
 namespace android {
@@ -19,7 +20,7 @@
 // JNIEnv-helper methods that RTC_CHECK success: no Java exception thrown and
 // found object/class/method/field is non-null.
 jclass GetClass(JNIEnv* jni, const char* class_name) {
-  jclass clazz = jni->FindClass(class_name);
+  jclass clazz = webrtc::jni::FindClass(jni, class_name);
   CHECK_EXCEPTION(jni) << "error during FindClass: " << class_name;
   RTC_CHECK(clazz) << class_name;
   return clazz;
diff --git a/sdk/android/src/jni/videoencoderwrapper.cc b/sdk/android/src/jni/videoencoderwrapper.cc
index 55ebeef..7c76b4e 100644
--- a/sdk/android/src/jni/videoencoderwrapper.cc
+++ b/sdk/android/src/jni/videoencoderwrapper.cc
@@ -21,6 +21,7 @@
 #include "rtc_base/logging.h"
 #include "rtc_base/random.h"
 #include "rtc_base/timeutils.h"
+#include "sdk/android/generated_video_jni/jni/VideoEncoder_jni.h"
 #include "sdk/android/src/jni/classreferenceholder.h"
 
 namespace webrtc {
@@ -40,31 +41,6 @@
           FindClass(jni, "org/webrtc/VideoEncoder$BitrateAllocation")),
       int_array_class_(jni, jni->FindClass("[I")),
       video_frame_factory_(jni) {
-  jclass encoder_class = FindClass(jni, "org/webrtc/VideoEncoder");
-
-  init_encode_method_ =
-      jni->GetMethodID(encoder_class, "initEncode",
-                       "(Lorg/webrtc/VideoEncoder$Settings;Lorg/webrtc/"
-                       "VideoEncoder$Callback;)Lorg/webrtc/VideoCodecStatus;");
-  release_method_ = jni->GetMethodID(encoder_class, "release",
-                                     "()Lorg/webrtc/VideoCodecStatus;");
-  encode_method_ = jni->GetMethodID(
-      encoder_class, "encode",
-      "(Lorg/webrtc/VideoFrame;Lorg/webrtc/"
-      "VideoEncoder$EncodeInfo;)Lorg/webrtc/VideoCodecStatus;");
-  set_channel_parameters_method_ =
-      jni->GetMethodID(encoder_class, "setChannelParameters",
-                       "(SJ)Lorg/webrtc/VideoCodecStatus;");
-  set_rate_allocation_method_ =
-      jni->GetMethodID(encoder_class, "setRateAllocation",
-                       "(Lorg/webrtc/VideoEncoder$BitrateAllocation;I)Lorg/"
-                       "webrtc/VideoCodecStatus;");
-  get_scaling_settings_method_ =
-      jni->GetMethodID(encoder_class, "getScalingSettings",
-                       "()Lorg/webrtc/VideoEncoder$ScalingSettings;");
-  get_implementation_name_method_ = jni->GetMethodID(
-      encoder_class, "getImplementationName", "()Ljava/lang/String;");
-
   settings_constructor_ =
       jni->GetMethodID(*settings_class_, "<init>", "(IIIIIZ)V");
 
@@ -146,7 +122,8 @@
                                     jlongFromPointer(this));
 
   jobject ret =
-      jni->CallObjectMethod(*encoder_, init_encode_method_, settings, callback);
+      Java_VideoEncoder_initEncode(jni, *encoder_, settings, callback);
+
   if (jni->CallIntMethod(ret, get_number_method_) == WEBRTC_VIDEO_CODEC_OK) {
     initialized_ = true;
   }
@@ -163,7 +140,7 @@
 int32_t VideoEncoderWrapper::Release() {
   JNIEnv* jni = AttachCurrentThreadIfNeeded();
   ScopedLocalRefFrame local_ref_frame(jni);
-  jobject ret = jni->CallObjectMethod(*encoder_, release_method_);
+  jobject ret = Java_VideoEncoder_release(jni, *encoder_);
   frame_extra_infos_.clear();
   initialized_ = false;
   encoder_queue_ = nullptr;
@@ -199,8 +176,8 @@
   info.timestamp_rtp = frame.timestamp();
   frame_extra_infos_.push_back(info);
 
-  jobject ret = jni->CallObjectMethod(
-      *encoder_, encode_method_, video_frame_factory_.ToJavaFrame(jni, frame),
+  jobject ret = Java_VideoEncoder_encode(
+      jni, *encoder_, video_frame_factory_.ToJavaFrame(jni, frame),
       encode_info);
   return HandleReturnCode(jni, ret);
 }
@@ -209,8 +186,8 @@
                                                   int64_t rtt) {
   JNIEnv* jni = AttachCurrentThreadIfNeeded();
   ScopedLocalRefFrame local_ref_frame(jni);
-  jobject ret = jni->CallObjectMethod(*encoder_, set_channel_parameters_method_,
-                                      (jshort)packet_loss, (jlong)rtt);
+  jobject ret = Java_VideoEncoder_setChannelParameters(
+      jni, *encoder_, (jshort)packet_loss, (jlong)rtt);
   return HandleReturnCode(jni, ret);
 }
 
@@ -221,8 +198,8 @@
   ScopedLocalRefFrame local_ref_frame(jni);
 
   jobject j_bitrate_allocation = ToJavaBitrateAllocation(jni, allocation);
-  jobject ret = jni->CallObjectMethod(*encoder_, set_rate_allocation_method_,
-                                      j_bitrate_allocation, (jint)framerate);
+  jobject ret = Java_VideoEncoder_setRateAllocation(
+      jni, *encoder_, j_bitrate_allocation, (jint)framerate);
   return HandleReturnCode(jni, ret);
 }
 
@@ -231,7 +208,7 @@
   JNIEnv* jni = AttachCurrentThreadIfNeeded();
   ScopedLocalRefFrame local_ref_frame(jni);
   jobject j_scaling_settings =
-      jni->CallObjectMethod(*encoder_, get_scaling_settings_method_);
+      Java_VideoEncoder_getScalingSettings(jni, *encoder_);
   bool on =
       jni->GetBooleanField(j_scaling_settings, scaling_settings_on_field_);
   jobject j_low =
@@ -461,8 +438,7 @@
 }
 
 std::string VideoEncoderWrapper::GetImplementationName(JNIEnv* jni) const {
-  jstring jname = reinterpret_cast<jstring>(
-      jni->CallObjectMethod(*encoder_, get_implementation_name_method_));
+  jstring jname = Java_VideoEncoder_getImplementationName(jni, *encoder_);
   return JavaToStdString(jni, jname);
 }
 
diff --git a/sdk/android/src/jni/videoencoderwrapper.h b/sdk/android/src/jni/videoencoderwrapper.h
index 4468fcb..866002a 100644
--- a/sdk/android/src/jni/videoencoderwrapper.h
+++ b/sdk/android/src/jni/videoencoderwrapper.h
@@ -96,14 +96,6 @@
   const ScopedGlobalRef<jclass> bitrate_allocation_class_;
   const ScopedGlobalRef<jclass> int_array_class_;
 
-  jmethodID init_encode_method_;
-  jmethodID release_method_;
-  jmethodID encode_method_;
-  jmethodID set_channel_parameters_method_;
-  jmethodID set_rate_allocation_method_;
-  jmethodID get_scaling_settings_method_;
-  jmethodID get_implementation_name_method_;
-
   jmethodID settings_constructor_;
 
   jmethodID encode_info_constructor_;
diff --git a/sdk/android/src/jni/videotrack_jni.cc b/sdk/android/src/jni/videotrack_jni.cc
index 0da609f..98b1bd2 100644
--- a/sdk/android/src/jni/videotrack_jni.cc
+++ b/sdk/android/src/jni/videotrack_jni.cc
@@ -12,6 +12,7 @@
 
 #include "api/mediastreaminterface.h"
 #include "rtc_base/logging.h"
+#include "sdk/android/generated_video_jni/jni/VideoSink_jni.h"
 #include "sdk/android/src/jni/classreferenceholder.h"
 #include "sdk/android/src/jni/jni_helpers.h"
 #include "sdk/android/src/jni/native_handle_impl.h"
@@ -29,24 +30,18 @@
  private:
   void OnFrame(const VideoFrame& frame) override;
 
-  jmethodID j_on_frame_method_;
-
   const JavaVideoFrameFactory java_video_frame_factory_;
   const ScopedGlobalRef<jobject> j_sink_;
 };
 
 VideoSinkWrapper::VideoSinkWrapper(JNIEnv* jni, jobject j_sink)
-    : java_video_frame_factory_(jni), j_sink_(jni, j_sink) {
-  jclass j_video_sink_class = FindClass(jni, "org/webrtc/VideoSink");
-  j_on_frame_method_ = jni->GetMethodID(j_video_sink_class, "onFrame",
-                                        "(Lorg/webrtc/VideoFrame;)V");
-}
+    : java_video_frame_factory_(jni), j_sink_(jni, j_sink) {}
 
 void VideoSinkWrapper::OnFrame(const VideoFrame& frame) {
   JNIEnv* jni = AttachCurrentThreadIfNeeded();
   ScopedLocalRefFrame local_ref_frame(jni);
-  jni->CallVoidMethod(*j_sink_, j_on_frame_method_,
-                      java_video_frame_factory_.ToJavaFrame(jni, frame));
+  Java_VideoSink_onFrame(jni, *j_sink_,
+                         java_video_frame_factory_.ToJavaFrame(jni, frame));
 }
 
 }  // namespace