Allow passing in a custom native library loader.

All previous initialize methods are deprecated and a new initialize
that uses a builder pattern is added. This gives us full control over
the order of initialization.

Bug: webrtc:7474
Change-Id: I006190e50f2e75c5015f0be75b86d367676db2cc
Reviewed-on: https://webrtc-review.googlesource.com/4160
Reviewed-by: Magnus Jedvert <magjed@webrtc.org>
Commit-Queue: Sami Kalliomäki <sakal@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#20037}
This commit is contained in:
Sami Kalliomäki
2017-09-29 12:49:46 +02:00
committed by Commit Bot
parent 7bcfc3b232
commit 5cd1cfb7c4
7 changed files with 190 additions and 65 deletions

View File

@ -18,15 +18,10 @@ import java.util.List;
* the PeerConnection API for clients.
*/
public class PeerConnectionFactory {
private static volatile boolean nativeLibLoaded;
static {
try {
System.loadLibrary("jingle_peerconnection_so");
nativeLibLoaded = true;
} catch (UnsatisfiedLinkError t) {
nativeLibLoaded = false;
}
// TODO(sakal): Remove once all dependencies have started using
// PeerConnectionFactory.initialize.
NativeLibrary.initialize(new NativeLibrary.DefaultLoader());
}
public static final String TRIAL_ENABLED = "Enabled";
@ -42,6 +37,65 @@ public class PeerConnectionFactory {
private EglBase localEglbase;
private EglBase remoteEglbase;
public static class InitializationOptions {
final Context applicationContext;
final String fieldTrials;
final boolean enableInternalTracer;
final boolean enableVideoHwAcceleration;
final NativeLibraryLoader nativeLibraryLoader;
private InitializationOptions(Context applicationContext, String fieldTrials,
boolean enableInternalTracer, boolean enableVideoHwAcceleration,
NativeLibraryLoader nativeLibraryLoader) {
this.applicationContext = applicationContext;
this.fieldTrials = fieldTrials;
this.enableInternalTracer = enableInternalTracer;
this.enableVideoHwAcceleration = enableVideoHwAcceleration;
this.nativeLibraryLoader = nativeLibraryLoader;
}
public static Builder builder(Context applicationContext) {
return new Builder(applicationContext);
}
public static class Builder {
private final Context applicationContext;
private String fieldTrials = "";
private boolean enableInternalTracer = true;
private boolean enableVideoHwAcceleration = true;
private NativeLibraryLoader nativeLibraryLoader = new NativeLibrary.DefaultLoader();
Builder(Context applicationContext) {
this.applicationContext = applicationContext;
}
public Builder setFieldTrials(String fieldTrials) {
this.fieldTrials = fieldTrials;
return this;
}
public Builder setEnableInternalTracer(boolean enableInternalTracer) {
this.enableInternalTracer = enableInternalTracer;
return this;
}
public Builder setEnableVideoHwAcceleration(boolean enableVideoHwAcceleration) {
this.enableVideoHwAcceleration = enableVideoHwAcceleration;
return this;
}
public Builder setNativeLibraryLoader(NativeLibraryLoader nativeLibraryLoader) {
this.nativeLibraryLoader = nativeLibraryLoader;
return this;
}
public PeerConnectionFactory.InitializationOptions createInitializationOptions() {
return new PeerConnectionFactory.InitializationOptions(applicationContext, fieldTrials,
enableInternalTracer, enableVideoHwAcceleration, nativeLibraryLoader);
}
}
}
public static class Options {
// Keep in sync with webrtc/rtc_base/network.h!
static final int ADAPTER_TYPE_UNKNOWN = 0;
@ -56,17 +110,35 @@ public class PeerConnectionFactory {
public boolean disableNetworkMonitor;
}
/**
* Loads and initializes WebRTC. This must be called at least once before creating a
* PeerConnectionFactory. Replaces all the old initialization methods. Must not be called while
* a PeerConnectionFactory is alive.
*/
public static void initialize(InitializationOptions options) {
ContextUtils.initialize(options.applicationContext);
NativeLibrary.initialize(options.nativeLibraryLoader);
nativeInitializeAndroidGlobals(options.applicationContext, options.enableVideoHwAcceleration);
initializeFieldTrials(options.fieldTrials);
if (options.enableInternalTracer) {
initializeInternalTracer();
}
}
// Must be called at least once before creating a PeerConnectionFactory
// (for example, at application startup time).
public static native void nativeInitializeAndroidGlobals(
private static native void nativeInitializeAndroidGlobals(
Context context, boolean videoHwAcceleration);
// Deprecated, use PeerConnectionFactory.initialize instead.
@Deprecated
public static void initializeAndroidGlobals(Context context, boolean videoHwAcceleration) {
ContextUtils.initialize(context);
nativeInitializeAndroidGlobals(context, videoHwAcceleration);
}
// Older signature of initializeAndroidGlobals. The extra parameters are now meaningless.
// Deprecated, use PeerConnectionFactory.initialize instead.
@Deprecated
public static boolean initializeAndroidGlobals(Object context, boolean initializeAudio,
boolean initializeVideo, boolean videoHwAcceleration) {
@ -76,7 +148,8 @@ public class PeerConnectionFactory {
// Field trial initialization. Must be called before PeerConnectionFactory
// is created.
public static native void initializeFieldTrials(String fieldTrialsInitString);
// Deprecated, use PeerConnectionFactory.initialize instead.
@Deprecated public static native void initializeFieldTrials(String fieldTrialsInitString);
// Wrapper of webrtc::field_trial::FindFullName. Develop the feature with default behaviour off.
// Example usage:
// if (PeerConnectionFactory.fieldTrialsFindFullName("WebRTCExperiment").equals("Enabled")) {
@ -85,12 +158,13 @@ public class PeerConnectionFactory {
// method2();
// }
public static String fieldTrialsFindFullName(String name) {
return nativeLibLoaded ? nativeFieldTrialsFindFullName(name) : "";
return NativeLibrary.isLoaded() ? nativeFieldTrialsFindFullName(name) : "";
}
private static native String nativeFieldTrialsFindFullName(String name);
// Internal tracing initialization. Must be called before PeerConnectionFactory is created to
// prevent racing with tracing code.
public static native void initializeInternalTracer();
// Deprecated, use PeerConnectionFactory.initialize instead.
@Deprecated public static native void initializeInternalTracer();
// Internal tracing shutdown, called to prevent resource leaks. Must be called after
// PeerConnectionFactory is gone to prevent races with code performing tracing.
public static native void shutdownInternalTracer();
@ -111,6 +185,11 @@ public class PeerConnectionFactory {
public PeerConnectionFactory(
Options options, VideoEncoderFactory encoderFactory, VideoDecoderFactory decoderFactory) {
if (!NativeLibrary.isLoaded() || ContextUtils.getApplicationContext() == null) {
throw new IllegalStateException(
"PeerConnectionFactory.initialize was not called before creating a "
+ "PeerConnectionFactory.");
}
nativeFactory = nativeCreatePeerConnectionFactory(options, encoderFactory, decoderFactory);
if (nativeFactory == 0) {
throw new RuntimeException("Failed to initialize PeerConnectionFactory!");