引言
基于WebRTC進行二次開發(fā)音羞,難免會需要對源碼進行修改、增加文件万哪,然后生成動態(tài)庫供上層調(diào)用。但由于WebRTC是用ninja編譯的抡秆,還是有些配置需要修改的奕巍,否則我們只能干瞪眼看著SDK調(diào)用放調(diào)用不到自己寫的類和方法。
下面我就總結(jié)下我增加純C函數(shù)供JNI層調(diào)用的過程儒士。(新建的文件的止、目錄根據(jù)自己需求來哈,流程是一致的)
Demo詳細(xì)步驟
新增代碼文件
1着撩、src/api/crypto/
目錄新增頭文件packet_observer.h
诅福,導(dǎo)出接口中的函數(shù)一定要為純虛函數(shù)匾委。
#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
氓润,對導(dǎo)出聲明變量一定要再定義變量赂乐。
#include <packet_observer.h>
PacketObserver *packet_observer;
extern "C" void JNIEXPORT registerPacketObserver(PacketObserver *observer) {
packet_observer = observer;
}
修改gn配置文件
1、找到src/api/crypto/BUILD.gn
咖气,增加新增文件編譯依賴挨措,在最下面增加以下內(nèi)容:
//以上內(nèi)容省略...
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 = [
//省略若干內(nèi)容...
"crypto:packet_observer",
]
}
修改JNI純C函數(shù)導(dǎo)出配置
1、進入src/build/android/android_only_jni_exports.lst文件悯舟,增加需要導(dǎo)出的C函數(shù)担租。
{
global:
JNI_OnLoad;
Java_*;
registerPacketObserver; //此函數(shù)為需要導(dǎo)出的函數(shù)
local:
*;
};
經(jīng)驗總結(jié)
WebRTC使用ninja編譯的,而整個項目是從src/BUILD.gn
開始執(zhí)行抵怎,所有依賴都是在各個子目錄里配置的BUILD.gn
奋救,然后父母錄會去遍歷子目錄的BUILD.gn
,這樣整個項目的編譯配置就都由各自目錄里來管理反惕。