首页 > 解决方案 > 使用 OpenCV 框架的 Appcelerator iOS 模块的循序渐进

问题描述

由于没有(至少不好)关于使用 OpenCV 框架的 Appcelerator iOS 模块的实现的文档,我决定提出这个问题并用我能做到的最完整的细节来回答它,以供进一步参考。

我希望它可以帮助其他人,所以他们不会像我一样挣扎很长时间(花了我一个多月的时间才成功编译模块并能够在 App 上运行它)。

在开始之前,我要感谢TiSlack的人们,他们在一些关键点上帮助了我。

标签: iosobjective-copencvappcelerator

解决方案


我将从描述我使用的所有软件的配置、版本和其他内容开始。

Appcelerator Titanium 移动 SDK - 9.2.0
Appcelerator CLI - 8.0.0
XCode 11.3.1
Mac OSX Mojave - 10.14.6
OpenCV - 4.4.0

  1. 从一开始,我就SDK 9.2.0从上面的链接下载了它,并将它(粘贴了 zip 文件的内容)安装在以下目录中:文件夹
    /Users/yourUserName/Library/Application Support/Titanium/mobilesdk/osx/
    的内容modules,我粘贴在:
    /Users/yourUserName/Library/Application Support/Titanium/modules

  2. 现在,我们需要创建一个以 iOS 作为部署目标的新 Appcelerator 模块。

    创建一个新的 Appcelerator 模块

    在此处输入图像描述

  3. 创建模块后(我将假设模块的名称为opencvtest),打开opencvtest.xcodeproj位于:
    yourPathToWorkspace/Appcelerator_Workspace/moduleName/ios/

  4. 现在,让我们开始配置模块以接收OpenCV Framework.
    首先,转到ComOpencvTest_Prefix.pch并使用以下代码:

     #ifdef __cplusplus
         #import <opencv2/opencv.hpp>
     #endif
    
     #ifdef __OBJC__
         #import <Foundation/Foundation.h>
         #import <UIKit/UIKit.h>
     #endif
    

要放置的__cplusplus零件,否则会出现一些编译错误(如OpenCV 教程中所述)。NEEDSBEFORE__OBJC__

  1. 现在,我们将opencv2.framework文件物理复制到 XCode 中项目的 Framework 文件夹中。(只需将它从 Finder 拖到 XCode 中)。

将 opencv2.framework 从 Finder 拖放到 XCode

DO NOT忘记选择Copy Items if Needed

如果需要,复制项目

opencv2.framework文件将被复制到/ios项目的文件夹中。我们需要将它移动到该/ios/platform文件夹​​中,否则该模块会在构建时使 App 崩溃。

在此处输入图像描述

  1. 现在,我们需要添加一些 OpenCV 需要的其他框架才能工作(同样,如上面提到的 OpenCV 教程中所述)。
    为此,我们需要在 XCode 上单击项目名称,然后选择Build Phases并展开Link Binary with Libraries. 单击+图标并选择以下框架列表,然后将其添加到项目中。它会是这样的:

框架清单

  1. 继续,我们需要配置一些东西。首先,点击Build Settings并搜索Other Linker Flags。然后,打开列表并添加-lz到其中。

其他链接器标志

我们还需要配置Library Search PathsFramework Search Paths.

以下是您应该在每个中添加的内容:

框架/库搜索路径

框架/库搜索路径

最后,我们需要创建一个User-defined build setting. 由于我遇到了一些错误,我在 StackOverflow 上找到了这一步。这是第 9 步的另一种解决方法。我从这个答案中得到了这个配置。继续,通过单击+并选择创建设置Add User-Defined Setting

用户自定义设置

对于它的描述和价值,使用:LD_VERIFY_BITCODENO.

LD_VERIFY_BITCODE

  1. OpenCV 使用Objective-C++所以,为了在您的项目中使用框架Classes,将使用它的需要是.mm而不是.m(这告诉编译器正确读取您的代码),所以像这样重命名它:

毫米

  1. 现在,由于某种未知的原因,我们必须创建一个.swift文件,它就是bridging-header.h文件。我在尝试编译模块并得到错误后了解到这一点:ld: warning: Could not find auto-linked framework 'swiftCore'. 很多人在 StackOverflow 上谈论这个错误,最常见的解决方法之一是swift使用bridging header. 所以,让我们这样做。

右键单击项目名称并选择New File. 然后,选择 Swift 文件。

快速文件

选择Classes文件夹作为文件的目的地.swift。其余的就这样离开。

然后 XCode 会要求创建一个Bridging Header文件。去做吧。

桥接头

  1. 在这一步中,我们将编译模块。为此,请打开Terminal应用程序并转到模块的/ios文件夹。
    然后,输入以下命令:appc run -p ios --build-only. 构建模块后,我们需要打开Finder并转到dist模块的目录。 /Users/yourUserName/Document/Appcelerator_Workspace/opencvtest/ios/dist/

dist 文件夹

解压里面的文件,就是模块本身。

  1. 现在,我们可以使用上面的例子ComOpencvTestModule.mm来调用Appcelerator Studio,来测试一下。

这些是示例:

- (NSString *)example:(id)args
{
    // Example method. 
    // Call with "MyModule.example(args)"
    return @"hello world";
}

- (NSString *)exampleProp
{
   // Example property getter. 
   // Call with "MyModule.exampleProp" or "MyModule.getExampleProp()"
   return @"Titanium rocks!";
}

- (void)setExampleProp:(id)value
{
   // Example property setter. 
  // Call with "MyModule.exampleProp = 'newValue'" or "MyModule.setExampleProp('newValue')"
}

所以,在Appcelerator Studio创建一个新的Mobile App Project.

新的移动应用项目

我选择了 Classic (Not Alloy) 和Default Project, 并使用了下面的配置:

应用创建配置

还记得.zip第 10 步中的文件吗?获取它创建的解压缩文件夹modules,并将其粘贴到项目的 App 根目录中。像这样:

应用内的模块

现在,tiapp.xml从应用程序的项目中打开文件。在Module部件上,单击+按钮并将您的模块链接到应用程序。

提阿普

现在我们终于准备好了!为了以非常非常简单的方式对其进行测试,我清理了app.js文件的所有内容并执行了以下操作:

var appWindow = Ti.UI.createWindow({});
var opencvTest = require('com.opencv.test'); //you must use a variable that requires your module.

opencvTest.example(); //now we use that variable to call for the module's  methods.
opencvTest.getExampleProp();

appWindow.open();

最后,在您选择的设备或模拟器上构建应用程序。为了测试,我在模拟器上运行它。

构建后,您应该有一个hello world和一个Titanium rocks!日志响应。

所有这一切看起来都非常简单,但正如我所说,我费了很大劲才走到这simple一步。所以,这个答案是为了帮助像我这样的人!=)


推荐阅读