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_t
而不是size_t
是否可以移植?
快速参考的链接在这里:
http://www.pjsip.org/pjlib/docs/html/group__PJ__PSTR.htm
使用PJSIP比标准C库有什么优势吗?
非常感谢任何建议,
答案 0 :(得分:6)
简答:使用PJSIP API(全部)。
答案很长:这取决于。
如果您正在编写标准桌面的应用程序,即x86 / x64 Windows / Mac / Linux,那么,如果您使用标准C库或PJSIP函数之类的包装器,则实际上并不重要。实际上,当然,可能有一些函数(正如您所指出的那样)采用pj_str_t
结构而不是char *
;那么使用PJSIP API只是为了简化和消除转换的需要会更容易。
我假设包装器的原因是让它更容易在嵌入式设备上开发。我不是指ARM或其他非x86处理器 - 尽管它也适用于那里;我的意思是定制嵌入式设备:具有非常特定目的并且不经常更改的东西。这些嵌入式设备的功能非常有限,有时甚至缺少操作系统。没有OS,这些处理器可能没有malloc
功能等。通常,与设备相关联的库,因为它们是如此定制的,并不完全是“标准的”,并且在某种程度上有所不同。通过包装所有内容,PJSIP可以避免大多数问题,甚至可以为strcpy
或malloc
之类的内容提供全面的实现,以便所有设备运行“相同”的代码。
包装材料也为“钩子”提供了手段。钩子可以实现更好的错误消息传递(以及可能的处理)。目前还不清楚PJSIP是否正在这样做(我从未使用过PJSIP - 我正在谈论使用其他框架的经验),但我指出它只是为了说明为什么框架可能会包装所有内容。
最后,它归结为您的目的:如果您首先选择使用PJSIP,那么我会全力以赴并使用其所有API。如果你只是在一些地方使用它(无论出于何种原因)那么它可能并不重要。同样,看起来PJSIP的目标是嵌入式设备(它列出了诺基亚甚至是RTOS系统),在这种情况下,为“标准”功能提供包装是相当普遍的。如果是这种情况,并且您正在以这种方式使用它,请务必使用整个API。
答案 1 :(得分:1)
你会坚持使用pjsip吗?
PJSIP源代码("软件")已获得General的许可 公共许可证(GPL)版本2或更高版本以及专有许可证 可以安排......
如果您认为GPL对于未来的扩展可能过于严格(例如Android&n'-GPL-in-userspace策略)且其专有许可证不可接受,您可以使用自己的便携式代码/您可以使用包含较少限制性BSD stlye库的包装器,如Baresip
有许多其他方法可以提供所需的功能,标准C库不支持它,其中许多将更好地测试(我讨厌提到autotools,但......它确实支持大多数平台 - 有些人会说太多了)或者你可以在musl-libc
中包含实现/改编另一件需要考虑的事情是C api基于标准并且相当一致,而给定项目中的包装器可以更自由地破坏API版本之间的兼容性(只需要一个glib / gtk程序员)