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