Skip to content

Instantly share code, notes, and snippets.

@vassjozsef
Last active March 4, 2019 04:34
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save vassjozsef/848b7fe7c46b107d276b019f21b0fb04 to your computer and use it in GitHub Desktop.
Save vassjozsef/848b7fe7c46b107d276b019f21b0fb04 to your computer and use it in GitHub Desktop.
WebRTC-65 for Java 7 Applications

Discord app targets API level 16, which does not support Java 8. Fortunately, with desugaring, we can still support API level 16, please see https://developer.android.com/studio/write/java8-support.html - however, external libraries already need to be desugared.

Java 8 is needed for building WebRTC 65. Instead of a single libwebrtc.jar, the following files are generated (javap -verbose MyClass | grep "major"):

Name Version Notes
libwebrtc.jar 52 ThreadUtils and Logging classes
audio_device_java.interface.java 52
audio_device_java.jar 51
libjingle_peerconnection_java.interface.jar 52
libjinlge_peerconnection_java.jar 51
libjingle_peerconnection_metrics_default_java.interface.jar 52 Not used
libjingle_peerconnection_metrics_default_java.jar 51 Not used

Interface JARs are merely function declarations and have major version 52 (Java 8), while implementation JARs are desugared to version 51 (Java 7).

When building WebRTC for Android, we reverted back to using dist_jar template, without interface JAR and with desugaring. This generated a single Java 7 libwebrtc.jar (just as with WebRTC 59). However EglBase::create (static interface method) is unavailable in libwebrtc.jar. We added a simple helper class as workaround.

The patch below is applied to WebRTC m65 branch 7ee493622bb721cc14bf45edf22a69118402f971.

From bef41bd99cf60b879f9dad4f842fb8a8eb54ba84 Mon Sep 17 00:00:00 2001
From: vassjozsef <jozsef_vass@yahoo.com>
Date: Tue, 6 Mar 2018 15:30:11 -0800
Subject: [PATCH] Webrtc-65 build for Android. (#11)
- We do not use interface jar (as webrtc-59). The resulting libwebrtc.jar includes all the classes that are needed.
- Desugaring to Java 7 removed interface static methods, so I added EglHelper class to work around it.
---
sdk/android/BUILD.gn | 8 ++++++--
sdk/android/api/org/webrtc/EglHelper.java | 15 +++++++++++++++
2 files changed, 21 insertions(+), 2 deletions(-)
create mode 100644 sdk/android/api/org/webrtc/EglHelper.java
diff --git a/sdk/android/BUILD.gn b/sdk/android/BUILD.gn
index 2f4e7f097..3d07c7e0d 100644
--- a/sdk/android/BUILD.gn
+++ b/sdk/android/BUILD.gn
@@ -570,10 +570,13 @@ template("java8_dist_jar") {
}
}
-java8_dist_jar("libwebrtc") {
+dist_jar("libwebrtc") {
_target_dir_name = get_label_info(":$target_name", "dir")
output = "${root_out_dir}/lib.java${_target_dir_name}/${target_name}.jar"
-
+ use_interface_jars = false
+ use_unprocessed_jars = false
+ supports_android = true
+ requires_android = true
deps = [
":libjingle_peerconnection_java",
":libjingle_peerconnection_metrics_default_java",
@@ -601,6 +604,7 @@ rtc_android_library("libjingle_peerconnection_java") {
"api/org/webrtc/DefaultVideoEncoderFactory.java",
"api/org/webrtc/DtmfSender.java",
"api/org/webrtc/EglBase.java",
+ "api/org/webrtc/EglHelper.java",
"api/org/webrtc/EglRenderer.java",
"api/org/webrtc/EncodedImage.java",
"api/org/webrtc/FileVideoCapturer.java",
diff --git a/sdk/android/api/org/webrtc/EglHelper.java b/sdk/android/api/org/webrtc/EglHelper.java
new file mode 100644
index 000000000..767339e34
--- /dev/null
+++ b/sdk/android/api/org/webrtc/EglHelper.java
@@ -0,0 +1,15 @@
+/*
+ * When desugaring Java 8 to Java 7, EglBase#create() static method
+ * is not available any more on the interface. This helper class
+ * solves the problem.
+ */
+
+package org.webrtc;
+
+import org.webrtc.EglBase;
+
+public class EglHelper {
+ public static EglBase create() {
+ return EglBase.create();
+ }
+}
--
2.16.2
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment