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));
 }
