使用 OpenCV 框架的 Appcelerator iOS 模块的循序渐进

The Step by Step of an Appcelerator iOS Module with OpenCV Framework

由于没有(至少不是很好的)关于使用 OpenCV 框架的 Appcelerator iOS 模块的实现的文档,我决定提出这个问题并尽可能详细地回答它, 供进一步参考。

我希望它能帮助到其他人,这样他们就不会像我一样挣扎了很长时间(我花了一个多月的时间才成功编译模块并能够 运行一个应用程序)。

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

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

Appcelerator Titanium Mobile SDK - 9.2.0
Appcelerator CLI - 8.0.0
XCode11.3.1
Mac OSX 莫哈韦沙漠 - 10.14.6
OpenCV - 4.4.0

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

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



  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部分,NEEDS要放在BEFORE__OBJC__,否则会出现一些编译错误(如OpenCV Tutorial).

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

DO NOT 忘了 select Copy Items if Needed.

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

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

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

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

以下是您应该在每一个中输入的内容:

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

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

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

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

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

Select Classes 文件夹作为 .swift 文件的目标。其余保持原样。

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

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

我select编辑了经典版(不是Alloy)和Default Project,并使用了以下配置:

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

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

现在我们终于可以出发了! 为了以非常非常简单的方式对其进行测试,我清除了 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 个步骤。所以,这个答案是为了帮助像我这样的人! =)