Remove deprecated jni_zero constructor usage in sdk/android

Some jni_zero constructors have been deprecated and restricted to
protected, except for WebRTC Android, which defines the
JNI_ZERO_ENABLE_COMPAT_API macro.

This change removes deprecated jni_zero usage in sdk/android, preparing
the codebase for the eventual removal of the JNI_ZERO_ENABLE_COMPAT_API
macro.

Bug: chromium:40173007
Change-Id: Ib454538bec298911cdc617572b3e6c9f0ef30b10
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/409500
Reviewed-by: Erik Språng <sprang@webrtc.org>
Reviewed-by: Zoé Lepaul <zlep@webrtc.org>
Commit-Queue: Erik Språng <sprang@webrtc.org>
Auto-Submit: Daniel.L (Byoungchan) Lee <daniel.l@hpcnt.com>
Cr-Commit-Position: refs/heads/main@{#45695}
diff --git a/modules/video_coding/codecs/test/android_codec_factory_helper.cc b/modules/video_coding/codecs/test/android_codec_factory_helper.cc
index 8f53e8f..f6a5046 100644
--- a/modules/video_coding/codecs/test/android_codec_factory_helper.cc
+++ b/modules/video_coding/codecs/test/android_codec_factory_helper.cc
@@ -57,11 +57,12 @@
       GetClass(env, "org/webrtc/HardwareVideoEncoderFactory");
   jmethodID factory_constructor = env->GetMethodID(
       factory_class.obj(), "<init>", "(Lorg/webrtc/EglBase$Context;ZZ)V");
-  ScopedJavaLocalRef<jobject> factory_object(
-      env, env->NewObject(factory_class.obj(), factory_constructor,
-                          nullptr /* shared_context */,
-                          false /* enable_intel_vp8_encoder */,
-                          true /* enable_h264_high_profile */));
+  ScopedJavaLocalRef<jobject> factory_object =
+      ScopedJavaLocalRef<jobject>::Adopt(
+          env, env->NewObject(factory_class.obj(), factory_constructor,
+                              nullptr /* shared_context */,
+                              false /* enable_intel_vp8_encoder */,
+                              true /* enable_h264_high_profile */));
   return JavaToNativeVideoEncoderFactory(env, factory_object.obj());
 }
 
@@ -71,9 +72,10 @@
       GetClass(env, "org/webrtc/HardwareVideoDecoderFactory");
   jmethodID factory_constructor = env->GetMethodID(
       factory_class.obj(), "<init>", "(Lorg/webrtc/EglBase$Context;)V");
-  ScopedJavaLocalRef<jobject> factory_object(
-      env, env->NewObject(factory_class.obj(), factory_constructor,
-                          nullptr /* shared_context */));
+  ScopedJavaLocalRef<jobject> factory_object =
+      ScopedJavaLocalRef<jobject>::Adopt(
+          env, env->NewObject(factory_class.obj(), factory_constructor,
+                              nullptr /* shared_context */));
   return JavaToNativeVideoDecoderFactory(env, factory_object.obj());
 }
 
diff --git a/sdk/android/instrumentationtests/loggable_test.cc b/sdk/android/instrumentationtests/loggable_test.cc
index 9b038a6..f2c34b1 100644
--- a/sdk/android/instrumentationtests/loggable_test.cc
+++ b/sdk/android/instrumentationtests/loggable_test.cc
@@ -25,8 +25,8 @@
                          JNIEnv* jni,
                          jclass,
                          jstring j_message) {
-  std::string message =
-      JavaToNativeString(jni, jni_zero::JavaParamRef<jstring>(jni, j_message));
+  std::string message = JavaToNativeString(
+      jni, jni_zero::JavaRef<jstring>::CreateLeaky(jni, j_message));
   RTC_LOG(LS_INFO) << message;
 }
 
diff --git a/sdk/android/instrumentationtests/video_frame_buffer_test.cc b/sdk/android/instrumentationtests/video_frame_buffer_test.cc
index 1e99453..31cdef4 100644
--- a/sdk/android/instrumentationtests/video_frame_buffer_test.cc
+++ b/sdk/android/instrumentationtests/video_frame_buffer_test.cc
@@ -28,8 +28,8 @@
                          JNIEnv* jni,
                          jclass,
                          jobject video_frame_buffer) {
-  const jni_zero::JavaParamRef<jobject> j_video_frame_buffer(
-      jni, video_frame_buffer);
+  const jni_zero::JavaRef<jobject> j_video_frame_buffer =
+      jni_zero::JavaRef<jobject>::CreateLeaky(jni, video_frame_buffer);
   webrtc::scoped_refptr<VideoFrameBuffer> buffer =
       JavaToNativeFrameBuffer(jni, j_video_frame_buffer);
   return static_cast<jint>(buffer->type());
@@ -40,7 +40,8 @@
                          JNIEnv* jni,
                          jclass,
                          jobject i420_buffer) {
-  const jni_zero::JavaParamRef<jobject> j_i420_buffer(jni, i420_buffer);
+  const jni_zero::JavaRef<jobject> j_i420_buffer =
+      jni_zero::JavaRef<jobject>::CreateLeaky(jni, i420_buffer);
   webrtc::scoped_refptr<VideoFrameBuffer> buffer =
       JavaToNativeFrameBuffer(jni, j_i420_buffer);
   const I420BufferInterface* inputBuffer = buffer->GetI420();
diff --git a/sdk/android/native_api/audio_device_module/audio_device_android.cc b/sdk/android/native_api/audio_device_module/audio_device_android.cc
index 512d28a..31b414c 100644
--- a/sdk/android/native_api/audio_device_module/audio_device_android.cc
+++ b/sdk/android/native_api/audio_device_module/audio_device_android.cc
@@ -45,7 +45,8 @@
                                jobject application_context,
                                AudioParameters* input_parameters,
                                AudioParameters* output_parameters) {
-  const jni_zero::JavaParamRef<jobject> j_context(env, application_context);
+  const auto j_context =
+      jni_zero::JavaParamRef<jobject>::CreateLeaky(env, application_context);
   const jni_zero::ScopedJavaLocalRef<jobject> j_audio_manager =
       jni::GetAudioManager(env, j_context);
   const int input_sample_rate = jni::GetDefaultSampleRate(env, j_audio_manager);
@@ -86,7 +87,8 @@
                                                 jobject application_context) {
   RTC_DLOG(LS_INFO) << __FUNCTION__;
   // Get default audio input/output parameters.
-  const jni_zero::JavaParamRef<jobject> j_context(env, application_context);
+  const auto j_context =
+      jni_zero::JavaParamRef<jobject>::CreateLeaky(env, application_context);
   const jni_zero::ScopedJavaLocalRef<jobject> j_audio_manager =
       jni::GetAudioManager(env, j_context);
   AudioParameters input_parameters;
@@ -114,7 +116,8 @@
     jobject application_context) {
   RTC_DLOG(LS_INFO) << __FUNCTION__;
   // Get default audio input/output parameters.
-  const jni_zero::JavaParamRef<jobject> j_context(env, application_context);
+  const auto j_context =
+      jni_zero::JavaParamRef<jobject>::CreateLeaky(env, application_context);
   const jni_zero::ScopedJavaLocalRef<jobject> j_audio_manager =
       jni::GetAudioManager(env, j_context);
   AudioParameters input_parameters;
@@ -169,7 +172,8 @@
                                                   jobject application_context) {
   RTC_DLOG(LS_INFO) << __FUNCTION__;
   // Get default audio input/output parameters.
-  const jni_zero::JavaParamRef<jobject> j_context(env, application_context);
+  const auto j_context =
+      jni_zero::JavaParamRef<jobject>::CreateLeaky(env, application_context);
   const jni_zero::ScopedJavaLocalRef<jobject> j_audio_manager =
       jni::GetAudioManager(env, j_context);
   AudioParameters input_parameters;
diff --git a/sdk/android/native_api/codecs/wrapper.cc b/sdk/android/native_api/codecs/wrapper.cc
index 1e707f8..da54920 100644
--- a/sdk/android/native_api/codecs/wrapper.cc
+++ b/sdk/android/native_api/codecs/wrapper.cc
@@ -29,28 +29,29 @@
 
 SdpVideoFormat JavaToNativeVideoCodecInfo(JNIEnv* jni, jobject codec_info) {
   return jni::VideoCodecInfoToSdpVideoFormat(
-      jni, jni_zero::JavaParamRef<jobject>(jni, codec_info));
+      jni, jni_zero::JavaRef<jobject>::CreateLeaky(jni, codec_info));
 }
 
 std::unique_ptr<VideoDecoderFactory> JavaToNativeVideoDecoderFactory(
     JNIEnv* jni,
     jobject decoder_factory) {
   return std::make_unique<jni::VideoDecoderFactoryWrapper>(
-      jni, jni_zero::JavaParamRef<jobject>(jni, decoder_factory));
+      jni, jni_zero::JavaRef<jobject>::CreateLeaky(jni, decoder_factory));
 }
 
 std::unique_ptr<VideoEncoderFactory> JavaToNativeVideoEncoderFactory(
     JNIEnv* jni,
     jobject encoder_factory) {
   return std::make_unique<jni::VideoEncoderFactoryWrapper>(
-      jni, jni_zero::JavaParamRef<jobject>(jni, encoder_factory));
+      jni, jni_zero::JavaRef<jobject>::CreateLeaky(jni, encoder_factory));
 }
 
 std::vector<VideoEncoder::ResolutionBitrateLimits>
 JavaToNativeResolutionBitrateLimits(JNIEnv* jni,
                                     const jobjectArray j_bitrate_limits_array) {
   return jni::JavaToNativeResolutionBitrateLimits(
-      jni, jni_zero::JavaParamRef<jobjectArray>(jni, j_bitrate_limits_array));
+      jni, jni_zero::JavaRef<jobjectArray>::CreateLeaky(
+               jni, j_bitrate_limits_array));
 }
 
 }  // namespace webrtc
diff --git a/sdk/android/native_api/jni/class_loader.cc b/sdk/android/native_api/jni/class_loader.cc
index 76ccba7..0b0aed5 100644
--- a/sdk/android/native_api/jni/class_loader.cc
+++ b/sdk/android/native_api/jni/class_loader.cc
@@ -54,7 +54,7 @@
     const jclass clazz = static_cast<jclass>(env->CallObjectMethod(
         class_loader_.obj(), load_class_method_, j_name.obj()));
     CHECK_EXCEPTION(env);
-    return ScopedJavaLocalRef<jclass>(env, clazz);
+    return ScopedJavaLocalRef<jclass>::Adopt(env, clazz);
   }
 
  private:
@@ -92,7 +92,7 @@
 
   std::string name(c_name);
   std::replace(name.begin(), name.end(), '.', '/');
-  return ScopedJavaLocalRef<jclass>(env, env->FindClass(name.c_str()));
+  return ScopedJavaLocalRef<jclass>::Adopt(env, env->FindClass(name.c_str()));
 }
 
 }  // namespace webrtc
diff --git a/sdk/android/native_api/jni/java_types.cc b/sdk/android/native_api/jni/java_types.cc
index c16aee2..a29f139 100644
--- a/sdk/android/native_api/jni/java_types.cc
+++ b/sdk/android/native_api/jni/java_types.cc
@@ -215,7 +215,7 @@
 ScopedJavaLocalRef<jstring> NativeToJavaString(JNIEnv* env, const char* str) {
   jstring j_str = env->NewStringUTF(str);
   CHECK_EXCEPTION(env) << "error during NewStringUTF";
-  return jni_zero::ScopedJavaLocalRef<jstring>(env, j_str);
+  return jni_zero::ScopedJavaLocalRef<jstring>::Adopt(env, j_str);
 }
 
 ScopedJavaLocalRef<jstring> NativeToJavaString(JNIEnv* jni,
@@ -249,8 +249,9 @@
 ScopedJavaLocalRef<jbyteArray> NativeToJavaByteArray(
     JNIEnv* env,
     ArrayView<int8_t> container) {
-  jni_zero::ScopedJavaLocalRef<jbyteArray> jarray(
-      env, env->NewByteArray(container.size()));
+  jni_zero::ScopedJavaLocalRef<jbyteArray> jarray =
+      jni_zero::ScopedJavaLocalRef<jbyteArray>::Adopt(
+          env, env->NewByteArray(container.size()));
   int8_t* array_ptr =
       env->GetByteArrayElements(jarray.obj(), /*isCopy=*/nullptr);
   memcpy(array_ptr, container.data(), container.size() * sizeof(int8_t));
@@ -261,8 +262,9 @@
 ScopedJavaLocalRef<jintArray> NativeToJavaIntArray(
     JNIEnv* env,
     ArrayView<int32_t> container) {
-  jni_zero::ScopedJavaLocalRef<jintArray> jarray(
-      env, env->NewIntArray(container.size()));
+  jni_zero::ScopedJavaLocalRef<jintArray> jarray =
+      jni_zero::ScopedJavaLocalRef<jintArray>::Adopt(
+          env, env->NewIntArray(container.size()));
   int32_t* array_ptr =
       env->GetIntArrayElements(jarray.obj(), /*isCopy=*/nullptr);
   memcpy(array_ptr, container.data(), container.size() * sizeof(int32_t));
@@ -390,7 +392,7 @@
   if (!list.is_null()) {
     for (const jni_zero::JavaRef<jobject>& str : Iterable(jni, list)) {
       converted_list.push_back(
-          JavaToStdString(jni, jni_zero::JavaParamRef<jstring>(
+          JavaToStdString(jni, jni_zero::JavaParamRef<jstring>::CreateLeaky(
                                    jni, static_cast<jstring>(str.obj()))));
     }
   }
diff --git a/sdk/android/native_api/jni/java_types.h b/sdk/android/native_api/jni/java_types.h
index cf54ef9..d6ab54f 100644
--- a/sdk/android/native_api/jni/java_types.h
+++ b/sdk/android/native_api/jni/java_types.h
@@ -161,7 +161,7 @@
   container.reserve(size);
   for (size_t i = 0; i < size; ++i) {
     container.emplace_back(convert(
-        env, jni_zero::ScopedJavaLocalRef<jobject>(
+        env, jni_zero::ScopedJavaLocalRef<jobject>::Adopt(
                  env, env->GetObjectArrayElement(j_container.obj(), i))));
   }
   CHECK_EXCEPTION(env) << "Error during JavaToNativeVector";
@@ -231,8 +231,9 @@
     const std::vector<T>& container,
     jclass clazz,
     Convert convert) {
-  jni_zero::ScopedJavaLocalRef<jobjectArray> j_container(
-      env, env->NewObjectArray(container.size(), clazz, nullptr));
+  jni_zero::ScopedJavaLocalRef<jobjectArray> j_container =
+      jni_zero::ScopedJavaLocalRef<jobjectArray>::Adopt(
+          env, env->NewObjectArray(container.size(), clazz, nullptr));
   int i = 0;
   for (const T& element : container) {
     env->SetObjectArrayElement(j_container.obj(), i,
@@ -355,7 +356,8 @@
 
 // Deprecated. Use scoped jobjects instead.
 inline std::string JavaToStdString(JNIEnv* jni, jstring j_string) {
-  return JavaToStdString(jni, jni_zero::JavaParamRef<jstring>(jni, j_string));
+  return JavaToStdString(
+      jni, jni_zero::JavaParamRef<jstring>::CreateLeaky(jni, j_string));
 }
 
 // Deprecated. Use JavaListToNativeVector<std::string, jstring> instead.
@@ -376,7 +378,8 @@
 // Deprecated. Use scoped jobjects instead.
 inline std::map<std::string, std::string> JavaToStdMapStrings(JNIEnv* jni,
                                                               jobject j_map) {
-  return JavaToStdMapStrings(jni, jni_zero::JavaParamRef<jobject>(jni, j_map));
+  return JavaToStdMapStrings(
+      jni, jni_zero::JavaParamRef<jobject>::CreateLeaky(jni, j_map));
 }
 
 }  // namespace webrtc
diff --git a/sdk/android/native_api/jni/scoped_java_ref.h b/sdk/android/native_api/jni/scoped_java_ref.h
index 09b8572..27baa50 100644
--- a/sdk/android/native_api/jni/scoped_java_ref.h
+++ b/sdk/android/native_api/jni/scoped_java_ref.h
@@ -28,9 +28,10 @@
 inline jni_zero::ScopedJavaLocalRef<T> static_java_ref_cast(
     JNIEnv* env,
     jni_zero::JavaRef<jobject> const& ref) {
-  jni_zero::ScopedJavaLocalRef<jobject> owned_ref(env, ref);
-  return jni_zero::ScopedJavaLocalRef<T>(env,
-                                         static_cast<T>(owned_ref.Release()));
+  jni_zero::ScopedJavaLocalRef<jobject> owned_ref =
+      jni_zero::ScopedJavaLocalRef<jobject>(ref);
+  return jni_zero::ScopedJavaLocalRef<T>::Adopt(
+      env, static_cast<T>(owned_ref.Release()));
 }
 
 }  // namespace webrtc
diff --git a/sdk/android/native_api/network_monitor/network_monitor.cc b/sdk/android/native_api/network_monitor/network_monitor.cc
index bbf31e7..dadc6b5 100644
--- a/sdk/android/native_api/network_monitor/network_monitor.cc
+++ b/sdk/android/native_api/network_monitor/network_monitor.cc
@@ -24,7 +24,7 @@
     JNIEnv* env,
     jobject application_context) {
   return std::make_unique<jni::AndroidNetworkMonitorFactory>(
-      env, jni_zero::JavaParamRef<jobject>(env, application_context));
+      env, jni_zero::JavaRef<jobject>::CreateLeaky(env, application_context));
 }
 
 std::unique_ptr<NetworkMonitorFactory> CreateAndroidNetworkMonitorFactory() {
diff --git a/sdk/android/native_api/video/wrapper.cc b/sdk/android/native_api/video/wrapper.cc
index 5514083..e6cddf9 100644
--- a/sdk/android/native_api/video/wrapper.cc
+++ b/sdk/android/native_api/video/wrapper.cc
@@ -27,7 +27,7 @@
     JNIEnv* jni,
     jobject video_sink) {
   return std::make_unique<jni::VideoSinkWrapper>(
-      jni, jni_zero::JavaParamRef<jobject>(jni, video_sink));
+      jni, jni_zero::JavaRef<jobject>::CreateLeaky(jni, video_sink));
 }
 
 ScopedJavaLocalRef<jobject> NativeToJavaVideoFrame(JNIEnv* jni,
diff --git a/sdk/android/src/jni/jni_helpers.cc b/sdk/android/src/jni/jni_helpers.cc
index 46d6e5c..f892bf6 100644
--- a/sdk/android/src/jni/jni_helpers.cc
+++ b/sdk/android/src/jni/jni_helpers.cc
@@ -21,7 +21,7 @@
 ScopedJavaLocalRef<jobject> NewDirectByteBuffer(JNIEnv* env,
                                                 void* address,
                                                 jlong capacity) {
-  ScopedJavaLocalRef<jobject> buffer(
+  ScopedJavaLocalRef<jobject> buffer = ScopedJavaLocalRef<jobject>::Adopt(
       env, env->NewDirectByteBuffer(address, capacity));
   CHECK_EXCEPTION(env) << "error NewDirectByteBuffer";
   return buffer;
diff --git a/sdk/android/src/jni/pc/call_session_file_rotating_log_sink.cc b/sdk/android/src/jni/pc/call_session_file_rotating_log_sink.cc
index 332aac6..17ba0e6 100644
--- a/sdk/android/src/jni/pc/call_session_file_rotating_log_sink.cc
+++ b/sdk/android/src/jni/pc/call_session_file_rotating_log_sink.cc
@@ -63,7 +63,8 @@
   if (log_size == 0) {
     RTC_LOG_V(LoggingSeverity::LS_WARNING)
         << "CallSessionFileRotatingStream returns 0 size for path " << dir_path;
-    return jni_zero::ScopedJavaLocalRef<jbyteArray>(jni, jni->NewByteArray(0));
+    return jni_zero::ScopedJavaLocalRef<jbyteArray>::Adopt(
+        jni, jni->NewByteArray(0));
   }
 
   // TODO(nisse, sakal): To avoid copying, change api to use ByteBuffer.
@@ -71,7 +72,8 @@
   size_t read = file_reader.ReadAll(buffer.get(), log_size);
 
   jni_zero::ScopedJavaLocalRef<jbyteArray> result =
-      jni_zero::ScopedJavaLocalRef<jbyteArray>(jni, jni->NewByteArray(read));
+      jni_zero::ScopedJavaLocalRef<jbyteArray>::Adopt(jni,
+                                                      jni->NewByteArray(read));
   jni->SetByteArrayRegion(result.obj(), 0, read, buffer.get());
 
   return result;
diff --git a/sdk/android/src/jni/pc/logging.cc b/sdk/android/src/jni/pc/logging.cc
index 9230d48..a076fd9 100644
--- a/sdk/android/src/jni/pc/logging.cc
+++ b/sdk/android/src/jni/pc/logging.cc
@@ -52,10 +52,10 @@
                          jint j_severity,
                          jstring j_tag,
                          jstring j_message) {
-  std::string message =
-      JavaToStdString(jni, jni_zero::JavaParamRef<jstring>(jni, j_message));
-  std::string tag =
-      JavaToStdString(jni, jni_zero::JavaParamRef<jstring>(jni, j_tag));
+  std::string message = JavaToNativeString(
+      jni, jni_zero::JavaRef<jstring>::CreateLeaky(jni, j_message));
+  std::string tag = JavaToNativeString(
+      jni, jni_zero::JavaRef<jstring>::CreateLeaky(jni, j_tag));
   RTC_LOG_TAG(static_cast<LoggingSeverity>(j_severity), tag.c_str()) << message;
 }
 
diff --git a/sdk/android/src/jni/pc/ssl_certificate_verifier_wrapper.cc b/sdk/android/src/jni/pc/ssl_certificate_verifier_wrapper.cc
index ce61720..48f23c9 100644
--- a/sdk/android/src/jni/pc/ssl_certificate_verifier_wrapper.cc
+++ b/sdk/android/src/jni/pc/ssl_certificate_verifier_wrapper.cc
@@ -34,8 +34,9 @@
   // Serialize the der encoding of the cert into a jbyteArray
   Buffer cert_der_buffer;
   certificate.ToDER(&cert_der_buffer);
-  ScopedJavaLocalRef<jbyteArray> jni_buffer(
-      jni, jni->NewByteArray(cert_der_buffer.size()));
+  ScopedJavaLocalRef<jbyteArray> jni_buffer =
+      ScopedJavaLocalRef<jbyteArray>::Adopt(
+          jni, jni->NewByteArray(cert_der_buffer.size()));
   jni->SetByteArrayRegion(
       jni_buffer.obj(), 0, cert_der_buffer.size(),
       reinterpret_cast<const jbyte*>(cert_der_buffer.data()));
diff --git a/sdk/android/src/jni/video_encoder_wrapper.cc b/sdk/android/src/jni/video_encoder_wrapper.cc
index aaeda72..f7e2817 100644
--- a/sdk/android/src/jni/video_encoder_wrapper.cc
+++ b/sdk/android/src/jni/video_encoder_wrapper.cc
@@ -452,9 +452,10 @@
 ScopedJavaLocalRef<jobject> VideoEncoderWrapper::ToJavaBitrateAllocation(
     JNIEnv* jni,
     const VideoBitrateAllocation& allocation) {
-  ScopedJavaLocalRef<jobjectArray> j_allocation_array(
-      jni, jni->NewObjectArray(kMaxSpatialLayers, int_array_class_.obj(),
-                               nullptr /* initial */));
+  ScopedJavaLocalRef<jobjectArray> j_allocation_array =
+      ScopedJavaLocalRef<jobjectArray>::Adopt(
+          jni, jni->NewObjectArray(kMaxSpatialLayers, int_array_class_.obj(),
+                                   nullptr /* initial */));
   for (int spatial_i = 0; spatial_i < kMaxSpatialLayers; ++spatial_i) {
     std::array<int32_t, kMaxTemporalStreams> spatial_layer;
     for (int temporal_i = 0; temporal_i < kMaxTemporalStreams; ++temporal_i) {
@@ -500,8 +501,9 @@
 
   const jsize array_length = jni->GetArrayLength(j_bitrate_limits_array.obj());
   for (int i = 0; i < array_length; ++i) {
-    ScopedJavaLocalRef<jobject> j_bitrate_limits = ScopedJavaLocalRef<jobject>(
-        jni, jni->GetObjectArrayElement(j_bitrate_limits_array.obj(), i));
+    ScopedJavaLocalRef<jobject> j_bitrate_limits =
+        ScopedJavaLocalRef<jobject>::Adopt(
+            jni, jni->GetObjectArrayElement(j_bitrate_limits_array.obj(), i));
 
     jint frame_size_pixels =
         Java_ResolutionBitrateLimits_getFrameSizePixels(jni, j_bitrate_limits);