如何在Swift项目中使用Superpowered lib

Yoa*_*nGJ 11 c++ objective-c++ ios swift

我想在Swift中制作一个应用程序,只需通过iPhone的麦克风录制,然后播放录制的声音.

为此,我想使用lib Superpowered这是一个带头文件的静态库.

为此,我尝试拖放项目中的.a和头文件(Xcode为我创建了一个桥接头文件),在Xcode> Target> General中添加了"链接框架和库"中的.a(等等) Xcode>目标>构建阶段>"链接二进制文件库"也可以在Xcode>目标>构建设置>搜索路径>库搜索路径中索引.h文件路径.

但是,我有错误"ld:未找到架构arm64的符号"与此处的XCode完全相同:架构arm64错误的未定义符号,我尝试了我在网上找到的所有解决方案,但仍然没有编译方式.

所以!

Superpowered为我们提供了一个示例应用程序来展示如何混合使用Objective-C++并在Swift项目中使用它们的lib(如果你想要https://github.com/superpoweredSDK/Low-Latency-Android-Audio-,这里有一个指向git的链接iOS-Audio-Engine).

以下是示例项目的一些屏幕截图,其中包含我理解的内容以及我不了解的内容:

桥接头文件Superpowered

Bridging-Header-File包含了我想在我的Swift代码中使用的lib方法的原型(我不喜欢这个,但如果它是唯一的方法......).

ViewController文件

viewController文件,其中Swift中的代码是,我可以创建一个Superpowered对象,感谢Bridging-Header-File,并调用我放入它的方法.

.mm文件

和wtf我甚至不明白为什么这个Objective-C++文件在这里以及它包含什么.它无处不在,甚至不是他们的lib文件.

因此,考虑到这个示例项目,我创建了自己的项目,这里有一些截图:

Briging报头 - 文件

同样的Bridging-Header-File在示例项目中除了我包含SuperpoweredIOSAudioIO.h所以我可以使用SuperpoweredIOSAudioIODelegate.

的viewController

我的viewController文件,其中Swift中的代码是,我可以创建一个Superpowered对象感谢Bridging-Header-File,并调用我放入它的方法.

直到这里,它是伟大的,除了我不能为例子创建一个SuperpoweredRecorder对象.如果我尝试将SuperpoweredRecorder.h文件包含在我的Bridging-Header-File中,我会遇到以下错误:

错误

所以我看到它是因为SuperpoweredRecorder.h包含一些.cpp文件而且我必须为cpp创建一个包装器(有点像我使用桥接头,没有?)但是包括.h和.mm文件我不喜欢我不知道我要把那个.mm文件放进去(代码是SuperpoweredRecorder.cpp什么?但是我无法访问它)

所以,是的,我对所有这些东西有点困惑,你能帮我理解如何在Swift项目中使用所有Superpowered lib吗?

Yoa*_*nGJ 6

正如我在评论@OmniProg时所说,我与Superpowered的首席技术官进行了一些对话,帮助我找到了下面的解决方案.

因此,由于Swift无法直接与C++交互,但可以与Objective-C交互,因此我不得不在Objective-C++(.mm文件,C++和Objective-C之间的混合)中创建对象,这些对象包含了lib Superpowered的C++类.

以下是来自lib的SuperpoweredRecorder对象的示例:

SuperpoweredRecorderWrapped.h

在这里,我创建了一个.h文件,其中我使用名称对我的包装器进行原型设计SuperpoweredRecorderWrapped,并且我还在其中原型SuperpoweredRecorder化了我想要使用的lib的所有方法.

SuperpoweredRecorderWrapped.mm

然后我创建一个新的.m文件,我重命名.mm并SuperpoweredRecorderWrapped在其上实现.我导入了两个SuperpoweredRecorderWrapped.hSuperpoweredRecorder.h.我创建一个SuperpoweredRecorder对象作为属性命名_wrapped,在我的方法中,我调用_wrapped对象的相应方法.就这样,当我打电话startSuperpoweredRecorderWrapped在我的银行代码,这人会打电话start_wrapped,一个SuperpoweredRecorder对象.看到诀窍?

桥头

最后,我将所有包装的类包含在我的Bridging-Header中,就像我可以从Swift实例化我的包装对象一样.

注意:所有的C++代码都必须在.mm文件中,这就是为什么我#include在我的.mm文件中创建包含C++代码而不在我的.h文件中的.h的原因.