Tag: Cplusplus

跨平台移动开发第三部分-iOS

现在,我们已经完成了在Android平台上设置和实现C ++代码的工作。 我们将从中断的地方继续,我们将尝试在iOS上运行代码! 如果您不知道Djinni是什么,请查阅第一部分的介绍和设置。 如果您想知道如何在Android上使用它,请查看第二部分以了解Android实现。 Apple的iOS一直使用Objective C作为主要语言来编写其应用程序,并且与C和C ++很好地集成在一起。 自从Swift语言发布以来,将Objective C代码集成到Swift还是相当容易的,反之亦然。 因此,即使没有Djinni,将C ++代码和Objective C链接起来也似乎很简单。 但是,我们仍然需要编写Objective C ++代码以将C ++链接到Objective C和Swift。 而且它仍然是相当复杂的代码。 Djinni消除了自己编写Objective C ++的痛苦。 动手 首先,我们将在项目根目录中创建一个名为iOSApplication的文件夹,如下所示: CPP计算器 | |-生成 | -src | -Android应用程序 | -iOSApplication * 之后,让我们启动Xcode并创建一个新的Xcode项目 选择单视图应用 将CalculatorApp设置为产品名称。 为了方便起见,我们将选择Swift作为首选语言。 并将您的项目放在刚创建的文件夹中。 我们将有一个空项目。 现在,您将必须在项目中创建几个组。 这是Bridge , Djinni和CalculatorImpl 。 第一组,我们将其命名为Bridge,用于生成的Objective C ++代码。 第二组我们将其命名为Djinni,以容纳Djinni支持库,第三组是CalculatorImpl,用于放置在第一部分中创建的所有C ++代码。 我们将从将Djinni生成的Objective C和Objective C ++代码复制到Xcode的Bridge组中开始。 将弹出一个对话框,询问我们是否要创建Bridging-Header.h文件。 […]

C ++ Lambdas的成功和错误回调

今天,我们将快速介绍如何使用Modern C ++ lambda实现成功和错误回调。 在我的应用程序中实现应用程序内购买客户端时,我不得不进行一些HTTP调用以检索各种文件/数据。 我决定将系统相关的iOS / macOS代码包装在一个简单的HTTP类中,并使用两个额外的模板化参数作为成功/失败回调。 这是向类提供两个半匿名lambda的一种非常简单的方法。 让我们从类/包装器定义开始: HTTPRequest类。 如您所见,它混合了Objective-C ++和块 现在,这是一个简单的帮助器函数,用于创建新的HTTPRequest: MakeHTTPRequest负责转发和创建 现在让我们看一个真实的例子: 该课程非常简单,缺少一些内容,但是您可以理解。 Lambda在不同的场景中绝对是非常有用的,而且自Xcode开始支持C ++ 11以来,我就发现自己严重依赖它们。 干杯!

在Swift项目中设置C ++库依赖项

如果我们知道窍门的话,这并不棘手。 T L; DR Swift无法直接读取C ++代码,但是如果我们使用Objective C ++将C ++库包装到一个Objective-C模块中,它将可以解决问题。 第一步:创建一个Objective-C项目 Xcode->新建->项目->可可触摸框架->语言:Objective-C->下一步。 我将项目命名为CppDependencyTutorial 。 第二步:设置项目依赖项 我有一个名为ExampleC ++ Library的静态C框架。 将ExampleC ++ Library.xcodeproj拖到CppDependencyTutorial项目中。 选择目标CppDependencyTutorial- > general- >链接的框架和库-> Add libExampleC ++ Library.a 。 第三步:创建一个Objective-C包装器 选择目标CppDependencyTutorial- > File-> New-> iOS-> Cocoa Touch class-> Next。 我将类CppDependencyWrapper命名为NSObject的子类,语言为:Objective-C。 ❗ 重要步骤 ❗:重命名 CppDependencyWrapper.m到CppDependencyWrapper.mm 。 它成为同时支持C ++和Objective C的Objective-C ++文件。 在CppDependencyWrapper.mm文件中,导入C标头路径。 第五步:在Swift项目中使用Objective-C模块 选择CppDependencyTutorial项目-> 常规 ->单击“ +”以添加新的快速测试目标-> […]

Objective-C和Swift —友好

有时候,对于Swift开发,仍然需要Objective-C。 例如,使用我在Swift,Speculid中内置的一个这样的应用程序,我需要引入Objective-C代码。随着2.0版中C ++库的引入,Objective-C成为必需。 幸运的是,有一些方法可以使Objective-C和Swift以友好的方式一起工作。 Speculid是使用最新版本的Xcode构建的完全开源的应用程序。 它可以自动将PNG和SVG文件转换为完整的图像集和应用程序图标的过程。 在第一个版本中,它需要安装Inkscape和ImageMagick以便于将图像从SVG或PNG转换为PDF或PNG。 这在安装和使用上都变得麻烦。 对于2.0版,我希望通过删除任何先决条件步骤和预先存在的依赖关系,使安装和集成过程尽可能地容易。 这意味着将所有必需的依赖项打包在应用程序包中。 在这种情况下,我们使用两个C ++库Cairo和libRSVG 。 开罗是整个开源社区中使用的领先2D库,而libRSVG用于读取SVG内容。 有了这两个库,接下来的挑战就变成了将它们集成到Swift代码中。 到目前为止,Swift无法直接与C ++交互。 因此,我们需要一个中介,并且这些中介可以是C或Objective-C的代码。 尽管C具有一些简单性,但在这种情况下,我选择了Objective-C。 我不仅拥有Objective-C的经验,而且Objective-C与Apple生态系统具有强大的集成。 尽管C的简单性。在我使用Objective-C时,我想将大部分代码保留在Swift中。 Objective-C仅在需要时用于与C ++库接口。 Swift将与用户交互,管理作业等……Objective-C将调用C ++库来构建实际的图形。 Swift代码将完全不了解实际用于读取,操作和写入结果文件的代码。 这是该过程的简要概述: Main —实例化并运行NSApplication SpeculidApplication —查找有问题的文件并使用Codable解析文件 查找源图形文件(PNG或SVG) 解析资产目录文件 解析规范文件中的规范 创建要传递给Objective-C代码的规范 在Objective-C中 ,使用传递给C ++函数的规范来写出目标图形文件(PNG或PDF) 有两种方法可以使我们的Objective-C和Swift代码协同工作。 一种是确保API使用兼容的类型。 Objective-C不使用Swift Structs。 这使类成为在Swift和Objective-C框架之间传递复杂数据的唯一方法。 但是,为了使接口彼此不可知,我们可以在Objective-C API中创建协议,这些协议可以向Swift表示所需的内容。 在我们的Objective-C框架中,Swift提供了两种方法。 调用Cairo库并采用ImageSpecificationProtocol和ImageHandle对象的主要方法: @interface CairoInterface:NSObject +(BOOL)exportImage:(id )sourceHandle withSpecification:(id )规范错误:(NSError **)错误; @结束 […]

将C ++库与Swift集成-如何构建

在“ Objective-C和Swift —友好相处”一文中,我谈到了如何使用Objective-C在Speculid中将C ++库与Swift集成在一起。 今天,我将讨论在XCode项目中使用C ++库的挑战。 Speculid是一个完全开源的应用程序,主要在Swift中使用最新版本的Xcode(10.1)构建(我将主要而不是仅解释其中的原因)。 借助Speculid,您可以拍摄一张图形并将其构建为完整的应用程序图标或图像集。 因此,这意味着将所有必需的依赖项打包在.App包中。 最初,我考虑将Inkscape和ImageMagick包含在安装中。 但是, Inkscape具有其他依赖项(例如XQuartz)这一事实意味着这太麻烦了。 因此,开罗和librsvg成为显而易见的选择。 将Cairo和librsvg与Swift集成 Speculid的第一个版本需要安装两个软件包:Inkscape和ImageMagick。 每个应用程序将以某种组合方式用于读取,操作和导出SVG,PNG,JPEG或PDF文件。 结果, 需要这些软件包使用户体验笨拙且困难。 但是,由于它们是完整的应用程序,包括这两个程序包也将很麻烦。 这就是为什么我着眼于集成C ++库的原因-特别是其中的两个: Cairo 和 libRSVG 。 Cairo和librsvg由多个软件包使用,是图形和SVG操作软件开发的领先库,尤其是在开源和Linux社区中。 因此,在Speculid v2.0中,我将这些库集成并打包为读取PNG和SVG以及导出PDF和PNG文件的主要方法 。 最重要的是,可以使用以下命令通过HomeBrew在Mac上安装这两个库: brew install cairo librsvg 现在,我们需要确保复制和链接文件。 正确链接和复制C ++库 为了使用C ++库, 我们可以将每段C ++代码作为它们各自的库编译在Speculid中,也可以集成已编译的库。 最初,似乎编译代码是最干净,最有效的方法,除了每个库都有很多要求以及用于编译每个库的特殊标志的事实。 因此,我决定采取另一种方法,并自己使用编译的库。 使用HomeBrew安装库之后,将Cairo和librsvg的目录复制到您的项目文件夹中。 HomeBrew将其应用程序和库存储在: /usr/local/Cellar 因此,例如, 开罗将位于: /usr/local/Cellar/cairo 将其复制到您的项目后,文件需要处于构建阶段的三个位置: 与库链接-所有.dylib文件都需要列出 复制文件-所有.dylib文件都需要复制到Frameworks文件夹 标头 -所有.h文件都需要在Project下列出 之后,您应该会很好。 […]