Android: Clean up JNI generated code

It's now possible to generate JNI code for constructors and enums
correctly. This CL cleans that up.

Bug: webrtc:8278,webrtc:8551,webrtc:8556
Change-Id: I2284a30139cbb186c80713eb6113eda5659c16ad
Reviewed-on: https://webrtc-review.googlesource.com/25622
Reviewed-by: Sami Kalliomäki <sakal@webrtc.org>
Commit-Queue: Magnus Jedvert <magjed@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#20860}
diff --git a/sdk/android/api/org/webrtc/EncodedImage.java b/sdk/android/api/org/webrtc/EncodedImage.java
index dc8eb62..84c72b1 100644
--- a/sdk/android/api/org/webrtc/EncodedImage.java
+++ b/sdk/android/api/org/webrtc/EncodedImage.java
@@ -12,8 +12,6 @@
 
 import java.nio.ByteBuffer;
 import java.util.concurrent.TimeUnit;
-// TODO(bugs.webrtc.org/8556): Remove unnecessary import.
-import org.webrtc.EncodedImage;
 
 /**
  * An encoded frame from a video stream. Used as an input for decoders and as an output for
@@ -36,9 +34,8 @@
       return nativeIndex;
     }
 
-    // TODO(bugs.webrtc.org/8556): Remove unnecessary 'EncodedImage.'.
     @CalledByNative("FrameType")
-    static EncodedImage.FrameType fromNativeIndex(int nativeIndex) {
+    static FrameType fromNativeIndex(int nativeIndex) {
       for (FrameType type : FrameType.values()) {
         if (type.getNative() == nativeIndex) {
           return type;
@@ -58,6 +55,7 @@
   public final boolean completeFrame;
   public final Integer qp;
 
+  @CalledByNative
   private EncodedImage(ByteBuffer buffer, int encodedWidth, int encodedHeight, long captureTimeNs,
       FrameType frameType, int rotation, boolean completeFrame, Integer qp) {
     this.buffer = buffer;
@@ -138,13 +136,4 @@
           rotation, completeFrame, qp);
     }
   }
-
-  // TODO(bugs.webrtc.org/8551) Remove.
-  @CalledByNative
-  static EncodedImage create(ByteBuffer buffer, int encodedWidth, int encodedHeight,
-      long captureTimeNs, EncodedImage.FrameType frameType, int rotation, boolean completeFrame,
-      Integer qp) {
-    return new EncodedImage(
-        buffer, encodedWidth, encodedHeight, captureTimeNs, frameType, rotation, completeFrame, qp);
-  }
 }
diff --git a/sdk/android/api/org/webrtc/Metrics.java b/sdk/android/api/org/webrtc/Metrics.java
index 3057067..fac41ed 100644
--- a/sdk/android/api/org/webrtc/Metrics.java
+++ b/sdk/android/api/org/webrtc/Metrics.java
@@ -38,6 +38,9 @@
   public final Map<String, HistogramInfo> map =
       new HashMap<String, HistogramInfo>(); // <name, HistogramInfo>
 
+  @CalledByNative
+  Metrics() {}
+
   /**
    * Class holding histogram information.
    */
@@ -48,6 +51,7 @@
     public final Map<Integer, Integer> samples =
         new HashMap<Integer, Integer>(); // <value, # of events>
 
+    @CalledByNative("HistogramInfo")
     public HistogramInfo(int min, int max, int bucketCount) {
       this.min = min;
       this.max = max;
@@ -76,18 +80,6 @@
     return getAndResetNative();
   }
 
-  // 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/api/org/webrtc/NetworkMonitorAutoDetect.java b/sdk/android/api/org/webrtc/NetworkMonitorAutoDetect.java
index ae7908d..86eb1c2 100644
--- a/sdk/android/api/org/webrtc/NetworkMonitorAutoDetect.java
+++ b/sdk/android/api/org/webrtc/NetworkMonitorAutoDetect.java
@@ -35,7 +35,6 @@
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
-import org.webrtc.NetworkMonitorAutoDetect;
 
 /**
  * Borrowed from Chromium's
@@ -90,7 +89,7 @@
     }
 
     @CalledByNative("NetworkInformation")
-    private NetworkMonitorAutoDetect.ConnectionType getConnectionType() {
+    private ConnectionType getConnectionType() {
       return type;
     }
 
diff --git a/sdk/android/api/org/webrtc/VideoDecoder.java b/sdk/android/api/org/webrtc/VideoDecoder.java
index f5acfad..7bf9ac5 100644
--- a/sdk/android/api/org/webrtc/VideoDecoder.java
+++ b/sdk/android/api/org/webrtc/VideoDecoder.java
@@ -21,6 +21,7 @@
     public final int width;
     public final int height;
 
+    @CalledByNative("Settings")
     public Settings(int numberOfCores, int width, int height) {
       this.numberOfCores = numberOfCores;
       this.width = width;
diff --git a/sdk/android/api/org/webrtc/VideoEncoder.java b/sdk/android/api/org/webrtc/VideoEncoder.java
index 30bfaaf..4f97fb0 100644
--- a/sdk/android/api/org/webrtc/VideoEncoder.java
+++ b/sdk/android/api/org/webrtc/VideoEncoder.java
@@ -10,6 +10,8 @@
 
 package org.webrtc;
 
+import org.webrtc.EncodedImage;
+
 /**
  * Interface for a video encoder that can be used with WebRTC. All calls will be made on the
  * encoding thread. The encoder may be constructed on a different thread and changing thread after
@@ -25,6 +27,7 @@
     public final int maxFramerate;
     public final boolean automaticResizeOn;
 
+    @CalledByNative("Settings")
     public Settings(int numberOfCores, int width, int height, int startBitrate, int maxFramerate,
         boolean automaticResizeOn) {
       this.numberOfCores = numberOfCores;
@@ -40,6 +43,7 @@
   public class EncodeInfo {
     public final EncodedImage.FrameType[] frameTypes;
 
+    @CalledByNative("EncodeInfo")
     public EncodeInfo(EncodedImage.FrameType[] frameTypes) {
       this.frameTypes = frameTypes;
     }
@@ -67,6 +71,7 @@
      * Initializes the allocation with a two dimensional array of bitrates. The first index of the
      * array is the spatial layer and the second index in the temporal layer.
      */
+    @CalledByNative("BitrateAllocation")
     public BitrateAllocation(int[][] bitratesBbs) {
       this.bitratesBbs = bitratesBbs;
     }
diff --git a/sdk/android/api/org/webrtc/VideoFrame.java b/sdk/android/api/org/webrtc/VideoFrame.java
index 62d4cf2..3ee368d 100644
--- a/sdk/android/api/org/webrtc/VideoFrame.java
+++ b/sdk/android/api/org/webrtc/VideoFrame.java
@@ -121,6 +121,7 @@
   private final int rotation;
   private final long timestampNs;
 
+  @CalledByNative
   public VideoFrame(Buffer buffer, int rotation, long timestampNs) {
     if (buffer == null) {
       throw new IllegalArgumentException("buffer not allowed to be null");
@@ -206,12 +207,6 @@
     return newBuffer;
   }
 
-  // TODO(bugs.webrtc.org/8278): Add a way to generate JNI code for constructors directly.
-  @CalledByNative
-  static VideoFrame create(Buffer buffer, int rotation, long timestampNs) {
-    return new VideoFrame(buffer, rotation, timestampNs);
-  }
-
   private static native void cropAndScaleI420Native(ByteBuffer srcY, int srcStrideY,
       ByteBuffer srcU, int srcStrideU, ByteBuffer srcV, int srcStrideV, int cropX, int cropY,
       int cropWidth, int cropHeight, ByteBuffer dstY, int dstStrideY, ByteBuffer dstU,
diff --git a/sdk/android/src/java/org/webrtc/CalledByNative.java b/sdk/android/src/java/org/webrtc/CalledByNative.java
index 42487ff..5d6c41f 100644
--- a/sdk/android/src/java/org/webrtc/CalledByNative.java
+++ b/sdk/android/src/java/org/webrtc/CalledByNative.java
@@ -19,7 +19,7 @@
  * @CalledByNative is used by the JNI generator to create the necessary JNI
  * bindings and expose this method to native code.
  */
-@Target(ElementType.METHOD)
+@Target({ElementType.CONSTRUCTOR, ElementType.METHOD})
 @Retention(RetentionPolicy.CLASS)
 @interface CalledByNative {
   /*
diff --git a/sdk/android/src/java/org/webrtc/VideoDecoderWrapper.java b/sdk/android/src/java/org/webrtc/VideoDecoderWrapper.java
index 97134c5..93e74e0 100644
--- a/sdk/android/src/java/org/webrtc/VideoDecoderWrapper.java
+++ b/sdk/android/src/java/org/webrtc/VideoDecoderWrapper.java
@@ -16,12 +16,6 @@
  * This class contains the Java glue code for JNI generation of VideoDecoder.
  */
 class VideoDecoderWrapper {
-  // TODO(bugs.webrtc.org/8551) Remove.
-  @CalledByNative
-  static VideoDecoder.Settings createSettings(int numberOfCores, int width, int height) {
-    return new VideoDecoder.Settings(numberOfCores, width, height);
-  }
-
   @CalledByNative
   static VideoDecoder.Callback createDecoderCallback(final long nativeDecoder) {
     return (VideoFrame frame, Integer decodeTimeMs,
diff --git a/sdk/android/src/java/org/webrtc/VideoEncoderWrapper.java b/sdk/android/src/java/org/webrtc/VideoEncoderWrapper.java
index 5acfe67..bc9fcec 100644
--- a/sdk/android/src/java/org/webrtc/VideoEncoderWrapper.java
+++ b/sdk/android/src/java/org/webrtc/VideoEncoderWrapper.java
@@ -11,7 +11,6 @@
 package org.webrtc;
 
 // Explicit imports necessary for JNI generation.
-import org.webrtc.EncodedImage;
 import org.webrtc.VideoEncoder;
 import java.nio.ByteBuffer;
 
@@ -20,23 +19,6 @@
  */
 class VideoEncoderWrapper {
   @CalledByNative
-  static VideoEncoder.Settings createSettings(int numberOfCores, int width, int height,
-      int startBitrate, int maxFramerate, boolean automaticResizeOn) {
-    return new VideoEncoder.Settings(
-        numberOfCores, width, height, startBitrate, maxFramerate, automaticResizeOn);
-  }
-
-  @CalledByNative
-  static VideoEncoder.EncodeInfo createEncodeInfo(EncodedImage.FrameType[] frameTypes) {
-    return new VideoEncoder.EncodeInfo(frameTypes);
-  }
-
-  @CalledByNative
-  static VideoEncoder.BitrateAllocation createBitrateAllocation(int[][] bitratesBbs) {
-    return new VideoEncoder.BitrateAllocation(bitratesBbs);
-  }
-
-  @CalledByNative
   static boolean getScalingSettingsOn(VideoEncoder.ScalingSettings scalingSettings) {
     return scalingSettings.on;
   }
diff --git a/sdk/android/src/jni/androidmetrics_jni.cc b/sdk/android/src/jni/androidmetrics_jni.cc
index 33e450c..6391e17 100644
--- a/sdk/android/src/jni/androidmetrics_jni.cc
+++ b/sdk/android/src/jni/androidmetrics_jni.cc
@@ -30,13 +30,13 @@
                          Metrics_getAndResetNative,
                          JNIEnv* jni,
                          jclass) {
-  jobject j_metrics = Java_Metrics_createMetrics(jni);
+  jobject j_metrics = Java_Metrics_Constructor(jni);
 
   std::map<std::string, std::unique_ptr<metrics::SampleInfo>> histograms;
   metrics::GetAndReset(&histograms);
   for (const auto& kv : histograms) {
     // Create and add samples to |HistogramInfo|.
-    jobject j_info = Java_Metrics_createHistogramInfo(
+    jobject j_info = Java_HistogramInfo_Constructor(
         jni, kv.second->min, kv.second->max,
         static_cast<int>(kv.second->bucket_count));
     for (const auto& sample : kv.second->samples) {
diff --git a/sdk/android/src/jni/encodedimage.cc b/sdk/android/src/jni/encodedimage.cc
index f540b77..966ef93 100644
--- a/sdk/android/src/jni/encodedimage.cc
+++ b/sdk/android/src/jni/encodedimage.cc
@@ -25,7 +25,7 @@
   jobject buffer = jni->NewDirectByteBuffer(image._buffer, image._length);
   jobject frame_type = NativeToJavaFrameType(jni, image._frameType);
   jobject qp = (image.qp_ == -1) ? nullptr : JavaIntegerFromInt(jni, image.qp_);
-  return Java_EncodedImage_create(
+  return Java_EncodedImage_Constructor(
       jni, buffer, image._encodedWidth, image._encodedHeight,
       image.capture_time_ms_ * rtc::kNumNanosecsPerMillisec, frame_type,
       static_cast<jint>(image.rotation_), image._completeFrame, qp);
diff --git a/sdk/android/src/jni/videodecoderwrapper.cc b/sdk/android/src/jni/videodecoderwrapper.cc
index 63bc76d..6b29c0e 100644
--- a/sdk/android/src/jni/videodecoderwrapper.cc
+++ b/sdk/android/src/jni/videodecoderwrapper.cc
@@ -57,7 +57,7 @@
 }
 
 int32_t VideoDecoderWrapper::InitDecodeInternal(JNIEnv* jni) {
-  jobject settings = Java_VideoDecoderWrapper_createSettings(
+  jobject settings = Java_Settings_Constructor(
       jni, number_of_cores_, codec_settings_.width, codec_settings_.height);
 
   jobject callback = Java_VideoDecoderWrapper_createDecoderCallback(
diff --git a/sdk/android/src/jni/videoencoderwrapper.cc b/sdk/android/src/jni/videoencoderwrapper.cc
index 66b54f9..19c00ec 100644
--- a/sdk/android/src/jni/videoencoderwrapper.cc
+++ b/sdk/android/src/jni/videoencoderwrapper.cc
@@ -74,7 +74,7 @@
       automatic_resize_on = true;
   }
 
-  jobject settings = Java_VideoEncoderWrapper_createSettings(
+  jobject settings = Java_Settings_Constructor(
       jni, number_of_cores_, codec_settings_.width, codec_settings_.height,
       codec_settings_.startBitrate, codec_settings_.maxFramerate,
       automatic_resize_on);
@@ -127,8 +127,7 @@
     jobject j_frame_type = NativeToJavaFrameType(jni, (*frame_types)[i]);
     jni->SetObjectArrayElement(j_frame_types, i, j_frame_type);
   }
-  jobject encode_info =
-      Java_VideoEncoderWrapper_createEncodeInfo(jni, j_frame_types);
+  jobject encode_info = Java_EncodeInfo_Constructor(jni, j_frame_types);
 
   FrameExtraInfo info;
   info.capture_time_ns = frame.timestamp_us() * rtc::kNumNanosecsPerMicrosec;
@@ -385,8 +384,7 @@
     jni->SetObjectArrayElement(j_allocation_array, spatial_i,
                                j_array_spatial_layer);
   }
-  return Java_VideoEncoderWrapper_createBitrateAllocation(jni,
-                                                          j_allocation_array);
+  return Java_BitrateAllocation_Constructor(jni, j_allocation_array);
 }
 
 std::string VideoEncoderWrapper::GetImplementationName(JNIEnv* jni) const {
diff --git a/sdk/android/src/jni/videoframe.cc b/sdk/android/src/jni/videoframe.cc
index be07c75..5dbc5fb 100644
--- a/sdk/android/src/jni/videoframe.cc
+++ b/sdk/android/src/jni/videoframe.cc
@@ -403,7 +403,7 @@
   } else {
     j_buffer = WrapI420Buffer(jni, buffer->ToI420());
   }
-  return Java_VideoFrame_create(
+  return Java_VideoFrame_Constructor(
       jni, j_buffer, static_cast<jint>(frame.rotation()),
       static_cast<jlong>(frame.timestamp_us() * rtc::kNumNanosecsPerMicrosec));
 }