Android: Allow injecting native PeerConnection.

This allows application to construct PeerConnection object in JNI and
pass that to Android API. API for wrapping Java PeerConnection Observers
is exposed for convenience.

Bug: webrtc:8662
Change-Id: Id110b92e6bb5ab00661cd50616d05c3e18a1697d
Reviewed-on: https://webrtc-review.googlesource.com/34520
Commit-Queue: Sami Kalliomäki <sakal@webrtc.org>
Reviewed-by: Jonas Oreland <jonaso@webrtc.org>
Reviewed-by: Taylor Brandstetter <deadbeef@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#21379}
This commit is contained in:
Sami Kalliomäki
2017-12-20 11:59:22 +01:00
committed by Commit Bot
parent afd8e8c304
commit 1ece1edddc
6 changed files with 45 additions and 15 deletions

View File

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

View File

@ -551,6 +551,14 @@ public class PeerConnection {
private List<RtpSender> senders = new ArrayList<>();
private List<RtpReceiver> 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);

View File

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