引言
基于WebRTC进行二次开发,难免会需要对源码进行修改、增加文件,然后生成动态库供上层调用。但由于WebRTC是用ninja编译的,还是有些配置需要修改的,否则我们只能干瞪眼看着SDK调用放调用不到自己写的类和方法。
下面我就总结下我增加纯C函数供JNI层调用的过程。(新建的文件、目录根据自己需求来哈,流程是一致的)
Demo详细步骤
新增代码文件
1、src/api/crypto/
目录新增头文件packet_observer.h
,导出接口中的函数一定要为纯虚函数。
#ifndef PACKET_OBSERVER_H
#define PACKET_OBSERVER_H
#include <jni.h>
class PacketObserver {
struct Packet {
const unsigned char *buffer;
size_t size;
};
PacketObserver();
virtual ~PacketObserver();
virtual void onSendPacket(Packet &packet) = 0;
virtual void onReceivePacket(Packet &packet) = 0;
}
extern "C" PacketObserver *packet_observer;
extern "C" void JNIEXPORT registerPacketObserver(PacketObserver *observer);
#endif
2、新增源文件packet_observer_register.cc
,对导出声明变量一定要再定义变量。
#include <packet_observer.h>
PacketObserver *packet_observer;
extern "C" void JNIEXPORT registerPacketObserver(PacketObserver *observer) {
packet_observer = observer;
}
修改gn配置文件
1、找到src/api/crypto/BUILD.gn
,增加新增文件编译依赖,在最下面增加以下内容:
//以上内容省略...
group("crypto") {
deps = [
":frame_decryptor_interface",
":frame_encryptor_interface",
":options",
":packet_observer", //把下面新增的编译文件源加入crypto组
]
}
rtc_source_set("packet_observer") {
visibility = [ "*" ]
sources = [
"packet_observer.h",
"packet_observer_register.cc",
]
deps = []
}
2、找到src/api/BUILD.gn
,增加上一步在子目录src/api/crypto/BUILD.gn
中增加的编译依赖源。
rtc_library("libjingle_peerconnection_api") {
deps = [
//省略若干内容...
"crypto:packet_observer",
]
}
修改JNI纯C函数导出配置
1、进入src/build/android/android_only_jni_exports.lst文件,增加需要导出的C函数。
{
global:
JNI_OnLoad;
Java_*;
registerPacketObserver; //此函数为需要导出的函数
local:
*;
};
经验总结
WebRTC使用ninja编译的,而整个项目是从src/BUILD.gn
开始执行,所有依赖都是在各个子目录里配置的BUILD.gn
,然后父母录会去遍历子目录的BUILD.gn
,这样整个项目的编译配置就都由各自目录里来管理。