Android: Add common function for adding/releasing native reference

This CL introduces common functions for adding and releasing
native references to reduce the number of JNI functions.

BUG=webrtc:8043

Review-Url: https://codereview.webrtc.org/3003213002
Cr-Original-Commit-Position: refs/heads/master@{#19547}
Cr-Mirrored-From: https://chromium.googlesource.com/external/webrtc
Cr-Mirrored-Commit: b1c7453bfa4c7d369069e6dd77e849994f0f1427
diff --git a/sdk/android/BUILD.gn b/sdk/android/BUILD.gn
index 429d3ff..16064cc 100644
--- a/sdk/android/BUILD.gn
+++ b/sdk/android/BUILD.gn
@@ -38,6 +38,7 @@
     "src/jni/androidhistogram_jni.cc",
     "src/jni/classreferenceholder.cc",
     "src/jni/classreferenceholder.h",
+    "src/jni/jni_common.cc",
     "src/jni/jni_helpers.cc",
     "src/jni/jni_helpers.h",
     "src/jni/pc/audio_jni.h",
@@ -437,6 +438,7 @@
     "src/java/org/webrtc/HardwareVideoEncoder.java",
     "src/java/org/webrtc/Histogram.java",
     "src/java/org/webrtc/I420BufferImpl.java",
+    "src/java/org/webrtc/JniCommon.java",
     "src/java/org/webrtc/MediaCodecUtils.java",
     "src/java/org/webrtc/NV12Buffer.java",
     "src/java/org/webrtc/NV21Buffer.java",
diff --git a/sdk/android/api/org/webrtc/DtmfSender.java b/sdk/android/api/org/webrtc/DtmfSender.java
index 20fdd2c..d284313 100644
--- a/sdk/android/api/org/webrtc/DtmfSender.java
+++ b/sdk/android/api/org/webrtc/DtmfSender.java
@@ -71,7 +71,7 @@
   }
 
   public void dispose() {
-    free(nativeDtmfSender);
+    JniCommon.nativeReleaseRef(nativeDtmfSender);
   }
 
   private static native boolean nativeCanInsertDtmf(long nativeDtmfSender);
@@ -80,5 +80,4 @@
   private static native String nativeTones(long nativeDtmfSender);
   private static native int nativeDuration(long nativeDtmfSender);
   private static native int nativeInterToneGap(long nativeDtmfSender);
-  private static native void free(long nativeDtmfSender);
 };
diff --git a/sdk/android/api/org/webrtc/MediaSource.java b/sdk/android/api/org/webrtc/MediaSource.java
index 9f6dec6..a26e889 100644
--- a/sdk/android/api/org/webrtc/MediaSource.java
+++ b/sdk/android/api/org/webrtc/MediaSource.java
@@ -26,10 +26,8 @@
   }
 
   public void dispose() {
-    free(nativeSource);
+    JniCommon.nativeReleaseRef(nativeSource);
   }
 
   private static native State nativeState(long pointer);
-
-  private static native void free(long nativeSource);
 }
diff --git a/sdk/android/api/org/webrtc/MediaStreamTrack.java b/sdk/android/api/org/webrtc/MediaStreamTrack.java
index 95de372..656d024 100644
--- a/sdk/android/api/org/webrtc/MediaStreamTrack.java
+++ b/sdk/android/api/org/webrtc/MediaStreamTrack.java
@@ -47,7 +47,7 @@
   }
 
   public void dispose() {
-    free(nativeTrack);
+    JniCommon.nativeReleaseRef(nativeTrack);
   }
 
   private static native String nativeId(long nativeTrack);
@@ -59,6 +59,4 @@
   private static native boolean nativeSetEnabled(long nativeTrack, boolean enabled);
 
   private static native State nativeState(long nativeTrack);
-
-  private static native void free(long nativeTrack);
 }
diff --git a/sdk/android/api/org/webrtc/PeerConnection.java b/sdk/android/api/org/webrtc/PeerConnection.java
index b2155c4..88610a4 100644
--- a/sdk/android/api/org/webrtc/PeerConnection.java
+++ b/sdk/android/api/org/webrtc/PeerConnection.java
@@ -405,12 +405,10 @@
       receiver.dispose();
     }
     receivers.clear();
-    freePeerConnection(nativePeerConnection);
+    JniCommon.nativeReleaseRef(nativePeerConnection);
     freeObserver(nativeObserver);
   }
 
-  private static native void freePeerConnection(long nativePeerConnection);
-
   private static native void freeObserver(long nativeObserver);
 
   public native boolean nativeSetConfiguration(RTCConfiguration config, long nativeObserver);
diff --git a/sdk/android/api/org/webrtc/RtpReceiver.java b/sdk/android/api/org/webrtc/RtpReceiver.java
index d4244ed..69dfd92 100644
--- a/sdk/android/api/org/webrtc/RtpReceiver.java
+++ b/sdk/android/api/org/webrtc/RtpReceiver.java
@@ -52,7 +52,7 @@
       nativeUnsetObserver(nativeRtpReceiver, nativeObserver);
       nativeObserver = 0;
     }
-    free(nativeRtpReceiver);
+    JniCommon.nativeReleaseRef(nativeRtpReceiver);
   }
 
   public void SetObserver(Observer observer) {
@@ -74,8 +74,6 @@
 
   private static native String nativeId(long nativeRtpReceiver);
 
-  private static native void free(long nativeRtpReceiver);
-
   private static native long nativeSetObserver(long nativeRtpReceiver, Observer observer);
 
   private static native long nativeUnsetObserver(long nativeRtpReceiver, long nativeObserver);
diff --git a/sdk/android/api/org/webrtc/RtpSender.java b/sdk/android/api/org/webrtc/RtpSender.java
index 2977953..fbb62db 100644
--- a/sdk/android/api/org/webrtc/RtpSender.java
+++ b/sdk/android/api/org/webrtc/RtpSender.java
@@ -82,7 +82,7 @@
     if (cachedTrack != null && ownsTrack) {
       cachedTrack.dispose();
     }
-    free(nativeRtpSender);
+    JniCommon.nativeReleaseRef(nativeRtpSender);
   }
 
   private static native boolean nativeSetTrack(long nativeRtpSender, long nativeTrack);
@@ -100,6 +100,4 @@
   private static native RtpParameters nativeGetParameters(long nativeRtpSender);
 
   private static native String nativeId(long nativeRtpSender);
-
-  private static native void free(long nativeRtpSender);
 };
diff --git a/sdk/android/src/java/org/webrtc/JniCommon.java b/sdk/android/src/java/org/webrtc/JniCommon.java
new file mode 100644
index 0000000..cc80bec
--- /dev/null
+++ b/sdk/android/src/java/org/webrtc/JniCommon.java
@@ -0,0 +1,18 @@
+/*
+ *  Copyright 2017 The WebRTC project authors. All Rights Reserved.
+ *
+ *  Use of this source code is governed by a BSD-style license
+ *  that can be found in the LICENSE file in the root of the source
+ *  tree. An additional intellectual property rights grant can be found
+ *  in the file PATENTS.  All contributing project authors may
+ *  be found in the AUTHORS file in the root of the source tree.
+ */
+
+package org.webrtc;
+
+/** Class with static JNI helper functions that are used in many places. */
+class JniCommon {
+  /** Functions to increment/decrement an rtc::RefCountInterface pointer. */
+  static native void nativeAddRef(long nativeRefCountedPointer);
+  static native void nativeReleaseRef(long nativeRefCountedPointer);
+}
diff --git a/sdk/android/src/java/org/webrtc/WrappedNativeI420Buffer.java b/sdk/android/src/java/org/webrtc/WrappedNativeI420Buffer.java
index 8a31869..85d02e6 100644
--- a/sdk/android/src/java/org/webrtc/WrappedNativeI420Buffer.java
+++ b/sdk/android/src/java/org/webrtc/WrappedNativeI420Buffer.java
@@ -89,12 +89,12 @@
 
   @Override
   public void retain() {
-    nativeAddRef(nativeBuffer);
+    JniCommon.nativeAddRef(nativeBuffer);
   }
 
   @Override
   public void release() {
-    nativeRelease(nativeBuffer);
+    JniCommon.nativeReleaseRef(nativeBuffer);
   }
 
   @Override
@@ -103,7 +103,4 @@
     return VideoFrame.cropAndScaleI420(
         this, cropX, cropY, cropWidth, cropHeight, scaleWidth, scaleHeight);
   }
-
-  private static native long nativeAddRef(long nativeBuffer);
-  private static native long nativeRelease(long nativeBuffer);
 }
diff --git a/sdk/android/src/jni/jni_common.cc b/sdk/android/src/jni/jni_common.cc
new file mode 100644
index 0000000..3a34ba3
--- /dev/null
+++ b/sdk/android/src/jni/jni_common.cc
@@ -0,0 +1,34 @@
+/*
+ *  Copyright 2017 The WebRTC project authors. All Rights Reserved.
+ *
+ *  Use of this source code is governed by a BSD-style license
+ *  that can be found in the LICENSE file in the root of the source
+ *  tree. An additional intellectual property rights grant can be found
+ *  in the file PATENTS.  All contributing project authors may
+ *  be found in the AUTHORS file in the root of the source tree.
+ */
+
+#include "webrtc/rtc_base/refcount.h"
+#include "webrtc/sdk/android/src/jni/jni_helpers.h"
+
+namespace webrtc_jni {
+
+JNI_FUNCTION_DECLARATION(void,
+                         JniCommon_nativeAddRef,
+                         JNIEnv* jni,
+                         jclass,
+                         jlong j_native_ref_counted_pointer) {
+  reinterpret_cast<rtc::RefCountInterface*>(j_native_ref_counted_pointer)
+      ->AddRef();
+}
+
+JNI_FUNCTION_DECLARATION(void,
+                         JniCommon_nativeReleaseRef,
+                         JNIEnv* jni,
+                         jclass,
+                         jlong j_native_ref_counted_pointer) {
+  reinterpret_cast<rtc::RefCountInterface*>(j_native_ref_counted_pointer)
+      ->Release();
+}
+
+}  // namespace webrtc_jni
diff --git a/sdk/android/src/jni/jni_helpers.cc b/sdk/android/src/jni/jni_helpers.cc
index 9101b27..6e23608 100644
--- a/sdk/android/src/jni/jni_helpers.cc
+++ b/sdk/android/src/jni/jni_helpers.cc
@@ -9,14 +9,14 @@
  */
 #include "webrtc/sdk/android/src/jni/jni_helpers.h"
 
-#include "webrtc/sdk/android/src/jni/classreferenceholder.h"
-
 #include <asm/unistd.h>
 #include <sys/prctl.h>
 #include <sys/syscall.h>
 #include <unistd.h>
 #include <vector>
 
+#include "webrtc/sdk/android/src/jni/classreferenceholder.h"
+
 namespace webrtc_jni {
 
 static JavaVM* g_jvm = nullptr;
diff --git a/sdk/android/src/jni/pc/dtmfsender_jni.cc b/sdk/android/src/jni/pc/dtmfsender_jni.cc
index b304956..fd1d195 100644
--- a/sdk/android/src/jni/pc/dtmfsender_jni.cc
+++ b/sdk/android/src/jni/pc/dtmfsender_jni.cc
@@ -62,13 +62,4 @@
       ->inter_tone_gap();
 }
 
-JNI_FUNCTION_DECLARATION(void,
-                         DtmfSender_free,
-                         JNIEnv* jni,
-                         jclass,
-                         jlong j_dtmf_sender_pointer) {
-  reinterpret_cast<webrtc::DtmfSenderInterface*>(j_dtmf_sender_pointer)
-      ->Release();
-}
-
 }  // namespace webrtc_jni
diff --git a/sdk/android/src/jni/pc/mediasource_jni.cc b/sdk/android/src/jni/pc/mediasource_jni.cc
index 6e3150d..0771b76 100644
--- a/sdk/android/src/jni/pc/mediasource_jni.cc
+++ b/sdk/android/src/jni/pc/mediasource_jni.cc
@@ -13,10 +13,6 @@
 
 namespace webrtc_jni {
 
-JNI_FUNCTION_DECLARATION(void, MediaSource_free, JNIEnv*, jclass, jlong j_p) {
-  reinterpret_cast<rtc::RefCountInterface*>(j_p)->Release();
-}
-
 JNI_FUNCTION_DECLARATION(jobject,
                          MediaSource_nativeState,
                          JNIEnv* jni,
diff --git a/sdk/android/src/jni/pc/mediastreamtrack_jni.cc b/sdk/android/src/jni/pc/mediastreamtrack_jni.cc
index 182c5e2..cae33fd 100644
--- a/sdk/android/src/jni/pc/mediastreamtrack_jni.cc
+++ b/sdk/android/src/jni/pc/mediastreamtrack_jni.cc
@@ -13,14 +13,6 @@
 
 namespace webrtc_jni {
 
-JNI_FUNCTION_DECLARATION(void,
-                         MediaStreamTrack_free,
-                         JNIEnv*,
-                         jclass,
-                         jlong j_p) {
-  reinterpret_cast<webrtc::MediaStreamTrackInterface*>(j_p)->Release();
-}
-
 JNI_FUNCTION_DECLARATION(jstring,
                          MediaStreamTrack_nativeId,
                          JNIEnv* jni,
diff --git a/sdk/android/src/jni/pc/peerconnection_jni.cc b/sdk/android/src/jni/pc/peerconnection_jni.cc
index 35b742b..dab5182 100644
--- a/sdk/android/src/jni/pc/peerconnection_jni.cc
+++ b/sdk/android/src/jni/pc/peerconnection_jni.cc
@@ -58,14 +58,6 @@
 }
 
 JNI_FUNCTION_DECLARATION(void,
-                         PeerConnection_freePeerConnection,
-                         JNIEnv*,
-                         jclass,
-                         jlong j_p) {
-  reinterpret_cast<webrtc::PeerConnectionInterface*>(j_p)->Release();
-}
-
-JNI_FUNCTION_DECLARATION(void,
                          PeerConnection_freeObserver,
                          JNIEnv*,
                          jclass,
diff --git a/sdk/android/src/jni/pc/rtpreceiver_jni.cc b/sdk/android/src/jni/pc/rtpreceiver_jni.cc
index 6010404..4c92e5e 100644
--- a/sdk/android/src/jni/pc/rtpreceiver_jni.cc
+++ b/sdk/android/src/jni/pc/rtpreceiver_jni.cc
@@ -64,15 +64,6 @@
           ->id());
 }
 
-JNI_FUNCTION_DECLARATION(void,
-                         RtpReceiver_free,
-                         JNIEnv* jni,
-                         jclass,
-                         jlong j_rtp_receiver_pointer) {
-  reinterpret_cast<webrtc::RtpReceiverInterface*>(j_rtp_receiver_pointer)
-      ->Release();
-}
-
 JNI_FUNCTION_DECLARATION(jlong,
                          RtpReceiver_nativeSetObserver,
                          JNIEnv* jni,
diff --git a/sdk/android/src/jni/pc/rtpsender_jni.cc b/sdk/android/src/jni/pc/rtpsender_jni.cc
index a9fe97d..dd13f73 100644
--- a/sdk/android/src/jni/pc/rtpsender_jni.cc
+++ b/sdk/android/src/jni/pc/rtpsender_jni.cc
@@ -83,13 +83,4 @@
                ->id());
 }
 
-JNI_FUNCTION_DECLARATION(void,
-                         RtpSender_free,
-                         JNIEnv* jni,
-                         jclass,
-                         jlong j_rtp_sender_pointer) {
-  reinterpret_cast<webrtc::RtpSenderInterface*>(j_rtp_sender_pointer)
-      ->Release();
-}
-
 }  // namespace webrtc_jni
diff --git a/sdk/android/src/jni/wrapped_native_i420_buffer.cc b/sdk/android/src/jni/wrapped_native_i420_buffer.cc
index ea83597..6a819e4 100644
--- a/sdk/android/src/jni/wrapped_native_i420_buffer.cc
+++ b/sdk/android/src/jni/wrapped_native_i420_buffer.cc
@@ -46,20 +46,4 @@
   return j_wrapped_native_i420_buffer;
 }
 
-JNI_FUNCTION_DECLARATION(void,
-                         WrappedNativeI420Buffer_nativeAddRef,
-                         JNIEnv* jni,
-                         jclass,
-                         jlong j_buffer_pointer) {
-  reinterpret_cast<webrtc::VideoFrameBuffer*>(j_buffer_pointer)->AddRef();
-}
-
-JNI_FUNCTION_DECLARATION(void,
-                         WrappedNativeI420Buffer_nativeRelease,
-                         JNIEnv* jni,
-                         jclass,
-                         jlong j_buffer_pointer) {
-  reinterpret_cast<webrtc::VideoFrameBuffer*>(j_buffer_pointer)->Release();
-}
-
 }  // namespace webrtc_jni