我有一个 C# 中的 DSP 音频 aglo,我想将它整合到 iOS 中。一位朋友建议我转换为 C++ 而不是 Objective-C,因为它与平台无关。这是一个好习惯,有什么需要注意的陷阱吗?我的直觉是让它与 Obj-C 保持原生。如何在 iOS 中访问 C++ 函数?
谢谢
我有一个 C# 中的 DSP 音频 aglo,我想将它整合到 iOS 中。一位朋友建议我转换为 C++ 而不是 Objective-C,因为它与平台无关。这是一个好习惯,有什么需要注意的陷阱吗?我的直觉是让它与 Obj-C 保持原生。如何在 iOS 中访问 C++ 函数?
谢谢
您可以自由地将 C++ 与 Objective-C 混合使用,它被称为“Objective-C++”。要让编译器知道这是您的意图,您需要将.m
文件重命名为.mm
.
混合这样的代码不一定是一个好主意,如果你的目标是可移植性,那也毫无意义。更好的做法是将 C++ 保存在单独的.cpp
文件中,并创建一个简单的包装类 (obj-c++) 在您的目标 C 和 C++ 对象之间传递数据(实际上,包装是调解 obj-C 方法和 C++ 函数以发送和返回数据)。
我最近在 github- openCVSquares和openCVStitch上发布了几个简单的图像处理示例。值得你看一看,看看 C++ 代码是如何从 obj-C 中分离出来的。
openCV 库具有 C++ 接口,因此在项目中使用 C++ 是不可避免的。可以将所有代码混合到 .mm 文件中,但这是一种容易造成混乱的方法。
至于可移植性,您可以通过将 UI 代码与数据操作代码分开来实现这一点。无论如何,您都应该为 MVC 执行此操作,因此按照这些示例用 C++ 编写模型将是很少的额外工作。该模型是可移植的,UI是并且应该是特定于平台的。
您是否应该这样做将取决于其他因素,例如您对每种语言的流利程度、框架和库的选择以及移植的可能性。不过,音频处理将是这种方法的自然候选者。
关于示例的一些细节
如果你不能让代码运行不要担心(openCV 框架可能很麻烦......)主要是看代码是如何拼凑在一起的。我试图使示例保持非常简单。
C++ 代码移植自 openCV 发行版中包含的 C++ 示例:squares.cpp和stitching.cpp。我试图尽可能少地改变这些以评估这种可移植性的想法。
粗略地说,我必须解决两个问题...
1/ 删除任何 UI 代码(所以我们只是将数据发送回 obj-C 端)。
2/ 修改 main() 函数,使其成为 obj-C 端的可调用函数。在 .cpp 头文件中,我声明了一个带有单个静态函数的简单类来促进这一点。显然还有更详细的空间,但这应该足以让您了解这个想法。