想写一篇分析webrtc源码的文章,梳理了半天,发现webrtc太大了,不知道从哪里开始。那就先从android源码开始吧,纯手打,如有不对之处,请及时指正。
api目录:提供android端可以直接调用的API。
src目录:提供Camera,MediaCodec等更细节的一些java层封装。
api目录下的文件会调用src目录下的文件。
每一个java类都通过jni映射与C++的源码进行对应,例如PeerConnectionFactory.java中的onWorkerThreadReady()接口
@CalledByNative
private void onWorkerThreadReady() {
workerThread = ThreadInfo.getCurrent();
staticWorkerThread = workerThread;
Logging.d(TAG, "onWorkerThreadReady");
}
会被src\sdk\android\src\jni\pc\peer_connection_factory.cc调用
PostJavaCallback(env, owned_factory->worker_thread(), RTC_FROM_HERE, j_pcf,
&Java_PeerConnectionFactory_onWorkerThreadReady);
看一下BUILD.gn这个编译脚本
if (is_android) {
import("//build/config/android/config.gni")
import("//build/config/android/rules.gni")
import("../../webrtc.gni")
group("android") {
if (!build_with_chromium && is_android) {
public_deps = [
":libjingle_peerconnection_jni",
":libjingle_peerconnection_so",
":libwebrtc",
":native_api",
]
}
}
。。。
rtc_shared_library("libjingle_peerconnection_so") {
sources = [
"src/jni/jni_onload.cc",
]
suppressed_configs += [ "//build/config/android:hide_all_but_jni_onload" ]
configs += [ "//build/config/android:hide_all_but_jni" ]
deps = [
":libjingle_peerconnection_jni",
":libjingle_peerconnection_metrics_default_jni",
"../../pc:libjingle_peerconnection",
"../../rtc_base",
]
output_extension = "so"
}
我们使用的libjingle_peerconnection_so.so的库是根据这个文件src/jni/jni_onload.c生成的,该文件会把webrtc::jni这个命名空间下的代码打进.so库。
此外,这个BUILD.gn脚本会把一些java文件打成jar包,供开发者调用。
rtc_android_library("base_java") {
java_files = [
"api/org/webrtc/RefCounted.java",
"api/org/webrtc/Predicate.java",
"src/java/org/webrtc/CalledByNative.java",
"src/java/org/webrtc/CalledByNativeUnchecked.java",
"src/java/org/webrtc/Histogram.java",
"src/java/org/webrtc/JniCommon.java",
"src/java/org/webrtc/JniHelper.java",
"src/java/org/webrtc/RefCountDelegate.java",
"src/java/org/webrtc/WebRtcClassLoader.java",
]
deps = [
"//rtc_base:base_java",
"//third_party/android_deps:com_android_support_support_annotations_java",
]
}
上面是base_java.jar的编译配置。