10
gcc (GCC) 4.7.2
PJ SIP 2.1

你好,

我正在开发一个将使用 PJSIP API 的应用程序。

只是查看 API 文档,我看到一些函数似乎只是标准 C 库的包装器。即pj_memset, pj_strncpy,pj_strlen

我可以看到一些可能值得考虑的替代方案,pj_strncpy_with_null()它们将始终 NULL 终止字符串。另一个优点可能是 pjsip 使用pj_str_t结构来存储字符串和大小。这可能比使用普通的 C 字符串更好。

无论如何使用pj_size_tover size_twhich 是可移植的有什么意义吗?

快速参考的链接在这里:

http://www.pjsip.org/pjlib/docs/html/group__PJ__PSTR.htm

与标准 C 库相比,使用 PJSIP 有什么真正的优势吗?

非常感谢您的任何建议,

4

2 回答 2

6

简短回答:使用 PJSIP API(全部)。

长答案:这取决于。

如果您正在为标准桌面(即 x86/x64 Windows/Mac/Linux)编写应用程序,那么不,如果您使用标准 C 库或 PJSIP 函数之类的包装器,这并不重要。当然,实际上,可能有一些函数采用(如您所指出的)pj_str_t结构而不是 a char *; 然后使用 PJSIP API 来简化和消除转换的需要会更容易。

我假设使用包装器的原因是为了更容易在嵌入式设备上进行开发。我不仅仅指 ARM 或其他非 x86 处理器——尽管它也可以应用在那里;我的意思是定制嵌入式设备:具有非常特定目的且不经常更改的东西。这些嵌入式设备的功能非常有限,有时甚至缺少操作系统。如果没有操作系统,这些处理器可能没有malloc功能等。通常,与设备相关的库,因为它们是定制的,并不完全是“标准的”,并且在一些小的方面有所不同。通过为所有内容提供包装器,PJSIP 可以避免大多数问题,甚至可以为所有设备运行“相同”代码之类的事情提供全面的strcpy实现malloc

Wrappers 还提供了“钩子”的方法。钩子可以更好地传递错误消息(并可能进行处理)。目前尚不清楚 PJSIP 是否正在这样做(我从未使用过 PJSIP——我是根据使用其他框架的经验来讨论的),但我指出它只是为了说明为什么框架可能会费心包装所有内容。

最后,归结为您的目的:如果您一开始就选择使用 PJSIP,那么我会全力以赴并使用它的所有 API。如果您只在几个地方使用它(无论出于何种原因),那么它可能并不重要。同样,PJSIP 似乎针对的是嵌入式设备(它列出了诺基亚甚至 RTOS 系统),在这些设备中为甚至“标准”功能提供包装器是相当普遍的。如果是这种情况,并且您以这种方式使用它,请务必使用整个 API。

于 2013-09-21T19:46:11.713 回答
1

你会坚持使用 pjsip 吗?

PJSIP 源代码(“软件”)在通用公共许可证 (GPL) 版本 2 或更高版本以及可以安排的专有许可证下获得许可...

如果您认为 GPL 对未来的扩展可能过于严格(例如 Android 的 no-GPL-in-userspace 政策)并且他们的专有许可是不可接受的,那么您可能会受益于使用您自己的可移植代码/包装器,您可以使用限制较少的 BSD 样式库,例如Baresip

在标准 C 库不支持的情况下,还有很多其他方法可以提供所需的功能,其中许多会经过更好的测试(我不想提及自动工具,但是......它确实支持大多数平台 - 有些人会说太多)或者您可以包含来自musl-libc的实现/改编

要考虑的另一件事是 C api 基于标准并且相当固定,而给定项目中的包装器可以更自由地破坏不同版本的 API 兼容性(只需询问 glib/gtk 程序员)

于 2013-09-24T05:06:14.350 回答