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

@ -587,6 +587,7 @@ rtc_android_library("libjingle_peerconnection_java") {
"api/org/webrtc/MediaStream.java", "api/org/webrtc/MediaStream.java",
"api/org/webrtc/MediaStreamTrack.java", "api/org/webrtc/MediaStreamTrack.java",
"api/org/webrtc/NativeLibraryLoader.java", "api/org/webrtc/NativeLibraryLoader.java",
"api/org/webrtc/NativePeerConnectionFactory.java",
"api/org/webrtc/NetworkMonitor.java", "api/org/webrtc/NetworkMonitor.java",
"api/org/webrtc/NetworkMonitorAutoDetect.java", "api/org/webrtc/NetworkMonitorAutoDetect.java",
"api/org/webrtc/PeerConnection.java", "api/org/webrtc/PeerConnection.java",
@ -606,8 +607,8 @@ rtc_android_library("libjingle_peerconnection_java") {
"api/org/webrtc/SoftwareVideoEncoderFactory.java", "api/org/webrtc/SoftwareVideoEncoderFactory.java",
"api/org/webrtc/StatsObserver.java", "api/org/webrtc/StatsObserver.java",
"api/org/webrtc/StatsReport.java", "api/org/webrtc/StatsReport.java",
"api/org/webrtc/SurfaceTextureHelper.java",
"api/org/webrtc/SurfaceEglRenderer.java", "api/org/webrtc/SurfaceEglRenderer.java",
"api/org/webrtc/SurfaceTextureHelper.java",
"api/org/webrtc/SurfaceViewRenderer.java", "api/org/webrtc/SurfaceViewRenderer.java",
"api/org/webrtc/TurnCustomizer.java", "api/org/webrtc/TurnCustomizer.java",
"api/org/webrtc/VideoCapturer.java", "api/org/webrtc/VideoCapturer.java",

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<RtpSender> senders = new ArrayList<>();
private List<RtpReceiver> receivers = 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) { PeerConnection(long nativePeerConnection, long nativeObserver) {
this.nativePeerConnection = nativePeerConnection; this.nativePeerConnection = nativePeerConnection;
this.nativeObserver = nativeObserver; this.nativeObserver = nativeObserver;
@ -745,7 +753,9 @@ public class PeerConnection {
} }
receivers.clear(); receivers.clear();
JniCommon.nativeReleaseRef(nativePeerConnection); JniCommon.nativeReleaseRef(nativePeerConnection);
freeObserver(nativeObserver); if (nativeObserver != 0) {
freeNativePeerConnectionObserver(nativeObserver);
}
} }
@CalledByNative @CalledByNative
@ -753,7 +763,8 @@ public class PeerConnection {
return nativePeerConnection; 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); private native boolean setNativeConfiguration(RTCConfiguration config, long nativeObserver);

View File

@ -226,7 +226,7 @@ public class PeerConnectionFactory {
@Deprecated @Deprecated
public PeerConnection createPeerConnection(PeerConnection.RTCConfiguration rtcConfig, public PeerConnection createPeerConnection(PeerConnection.RTCConfiguration rtcConfig,
MediaConstraints constraints, PeerConnection.Observer observer) { MediaConstraints constraints, PeerConnection.Observer observer) {
long nativeObserver = createNativeObserver(observer); long nativeObserver = PeerConnection.createNativePeerConnectionObserver(observer);
if (nativeObserver == 0) { if (nativeObserver == 0) {
return null; return null;
} }
@ -388,8 +388,6 @@ public class PeerConnectionFactory {
VideoEncoderFactory encoderFactory, VideoDecoderFactory decoderFactory, VideoEncoderFactory encoderFactory, VideoDecoderFactory decoderFactory,
long nativeAudioProcessor); long nativeAudioProcessor);
private static native long createNativeObserver(PeerConnection.Observer observer);
private static native long createNativePeerConnection(long nativeFactory, private static native long createNativePeerConnection(long nativeFactory,
PeerConnection.RTCConfiguration rtcConfig, MediaConstraints constraints, long nativeObserver); PeerConnection.RTCConfiguration rtcConfig, MediaConstraints constraints, long nativeObserver);

View File

@ -440,8 +440,16 @@ jobjectArray PeerConnectionObserverJni::NativeToJavaMediaStreamArray(
return java_streams; 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, JNI_FUNCTION_DECLARATION(void,
PeerConnection_freeObserver, PeerConnection_freeNativePeerConnectionObserver,
JNIEnv*, JNIEnv*,
jclass, jclass,
jlong j_p) { jlong j_p) {

View File

@ -93,14 +93,6 @@ void PeerConnectionFactorySignalingThreadReady() {
Java_PeerConnectionFactory_onSignalingThreadReady(env); 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, JNI_FUNCTION_DECLARATION(void,
PeerConnectionFactory_initializeNativeAndroidGlobals, PeerConnectionFactory_initializeNativeAndroidGlobals,
JNIEnv* jni, JNIEnv* jni,