diff --git a/sdk/android/BUILD.gn b/sdk/android/BUILD.gn index 3faca81f36..36f4a50472 100644 --- a/sdk/android/BUILD.gn +++ b/sdk/android/BUILD.gn @@ -587,6 +587,7 @@ rtc_android_library("libjingle_peerconnection_java") { "api/org/webrtc/MediaStream.java", "api/org/webrtc/MediaStreamTrack.java", "api/org/webrtc/NativeLibraryLoader.java", + "api/org/webrtc/NativePeerConnectionFactory.java", "api/org/webrtc/NetworkMonitor.java", "api/org/webrtc/NetworkMonitorAutoDetect.java", "api/org/webrtc/PeerConnection.java", @@ -606,8 +607,8 @@ rtc_android_library("libjingle_peerconnection_java") { "api/org/webrtc/SoftwareVideoEncoderFactory.java", "api/org/webrtc/StatsObserver.java", "api/org/webrtc/StatsReport.java", - "api/org/webrtc/SurfaceTextureHelper.java", "api/org/webrtc/SurfaceEglRenderer.java", + "api/org/webrtc/SurfaceTextureHelper.java", "api/org/webrtc/SurfaceViewRenderer.java", "api/org/webrtc/TurnCustomizer.java", "api/org/webrtc/VideoCapturer.java", diff --git a/sdk/android/api/org/webrtc/NativePeerConnectionFactory.java b/sdk/android/api/org/webrtc/NativePeerConnectionFactory.java new file mode 100644 index 0000000000..63ecf10ca2 --- /dev/null +++ b/sdk/android/api/org/webrtc/NativePeerConnectionFactory.java @@ -0,0 +1,20 @@ +/* + * 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; + +/** Factory for creating webrtc::PeerConnectionInterface instances. */ +public interface NativePeerConnectionFactory { + /** + * Create a new webrtc::PeerConnectionInterface instance and returns a pointer to it. + * The caller takes ownership of the object. + */ + long createNativePeerConnection(); +} diff --git a/sdk/android/api/org/webrtc/PeerConnection.java b/sdk/android/api/org/webrtc/PeerConnection.java index 6c278725aa..8eddfa8455 100644 --- a/sdk/android/api/org/webrtc/PeerConnection.java +++ b/sdk/android/api/org/webrtc/PeerConnection.java @@ -551,6 +551,14 @@ public class PeerConnection { private List senders = new ArrayList<>(); private List receivers = new ArrayList<>(); + /** + * Wraps a PeerConnection created by the factory. Can be used by clients that want to implement + * their PeerConnection creation in JNI. + */ + public PeerConnection(NativePeerConnectionFactory factory) { + this(factory.createNativePeerConnection(), 0 /* nativeObserver */); + } + PeerConnection(long nativePeerConnection, long nativeObserver) { this.nativePeerConnection = nativePeerConnection; this.nativeObserver = nativeObserver; @@ -745,7 +753,9 @@ public class PeerConnection { } receivers.clear(); JniCommon.nativeReleaseRef(nativePeerConnection); - freeObserver(nativeObserver); + if (nativeObserver != 0) { + freeNativePeerConnectionObserver(nativeObserver); + } } @CalledByNative @@ -753,7 +763,8 @@ public class PeerConnection { return nativePeerConnection; } - private static native void freeObserver(long nativeObserver); + public static native long createNativePeerConnectionObserver(Observer observer); + public static native void freeNativePeerConnectionObserver(long nativeObserver); private native boolean setNativeConfiguration(RTCConfiguration config, long nativeObserver); diff --git a/sdk/android/api/org/webrtc/PeerConnectionFactory.java b/sdk/android/api/org/webrtc/PeerConnectionFactory.java index c51ebd2b9c..c8c5b9a420 100644 --- a/sdk/android/api/org/webrtc/PeerConnectionFactory.java +++ b/sdk/android/api/org/webrtc/PeerConnectionFactory.java @@ -226,7 +226,7 @@ public class PeerConnectionFactory { @Deprecated public PeerConnection createPeerConnection(PeerConnection.RTCConfiguration rtcConfig, MediaConstraints constraints, PeerConnection.Observer observer) { - long nativeObserver = createNativeObserver(observer); + long nativeObserver = PeerConnection.createNativePeerConnectionObserver(observer); if (nativeObserver == 0) { return null; } @@ -388,8 +388,6 @@ public class PeerConnectionFactory { VideoEncoderFactory encoderFactory, VideoDecoderFactory decoderFactory, long nativeAudioProcessor); - private static native long createNativeObserver(PeerConnection.Observer observer); - private static native long createNativePeerConnection(long nativeFactory, PeerConnection.RTCConfiguration rtcConfig, MediaConstraints constraints, long nativeObserver); diff --git a/sdk/android/src/jni/pc/peerconnection.cc b/sdk/android/src/jni/pc/peerconnection.cc index 4844603144..05a2a95010 100644 --- a/sdk/android/src/jni/pc/peerconnection.cc +++ b/sdk/android/src/jni/pc/peerconnection.cc @@ -440,8 +440,16 @@ jobjectArray PeerConnectionObserverJni::NativeToJavaMediaStreamArray( return java_streams; } +JNI_FUNCTION_DECLARATION(jlong, + PeerConnection_createNativePeerConnectionObserver, + JNIEnv* jni, + jclass, + jobject j_observer) { + return jlongFromPointer(new PeerConnectionObserverJni(jni, j_observer)); +} + JNI_FUNCTION_DECLARATION(void, - PeerConnection_freeObserver, + PeerConnection_freeNativePeerConnectionObserver, JNIEnv*, jclass, jlong j_p) { diff --git a/sdk/android/src/jni/pc/peerconnectionfactory.cc b/sdk/android/src/jni/pc/peerconnectionfactory.cc index 1eb077022b..a85e922227 100644 --- a/sdk/android/src/jni/pc/peerconnectionfactory.cc +++ b/sdk/android/src/jni/pc/peerconnectionfactory.cc @@ -93,14 +93,6 @@ void PeerConnectionFactorySignalingThreadReady() { Java_PeerConnectionFactory_onSignalingThreadReady(env); } -JNI_FUNCTION_DECLARATION(jlong, - PeerConnectionFactory_createNativeObserver, - JNIEnv* jni, - jclass, - jobject j_observer) { - return (jlong) new PeerConnectionObserverJni(jni, j_observer); -} - JNI_FUNCTION_DECLARATION(void, PeerConnectionFactory_initializeNativeAndroidGlobals, JNIEnv* jni,