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}
diff --git a/sdk/android/api/org/webrtc/PeerConnection.java b/sdk/android/api/org/webrtc/PeerConnection.java
index 6c27872..8eddfa8 100644
--- a/sdk/android/api/org/webrtc/PeerConnection.java
+++ b/sdk/android/api/org/webrtc/PeerConnection.java
@@ -551,6 +551,14 @@
   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 @@
     }
     receivers.clear();
     JniCommon.nativeReleaseRef(nativePeerConnection);
-    freeObserver(nativeObserver);
+    if (nativeObserver != 0) {
+      freeNativePeerConnectionObserver(nativeObserver);
+    }
   }
 
   @CalledByNative
@@ -753,7 +763,8 @@
     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);