美文网首页
WebRTC-导出纯C函数到so动态库

WebRTC-导出纯C函数到so动态库

作者: itcayman | 来源:发表于2020-09-17 16:28 被阅读0次

引言

基于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,这样整个项目的编译配置就都由各自目录里来管理。

相关文章

网友评论

      本文标题:WebRTC-导出纯C函数到so动态库

      本文链接:https://www.haomeiwen.com/subject/vmblyktx.html