使用 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
从一开始,我就从上面的link下载了SDK 9.2.0
,并安装(粘贴zip文件的内容)到下面的目录:
/Users/yourUserName/Library/Application Support/Titanium/mobilesdk/osx/
modules
文件夹的内容,我贴在:
/Users/yourUserName/Library/Application Support/Titanium/modules
现在,我们需要创建一个新的 Appcelerator 模块,并将 iOS 作为部署目标。
创建模块后(我假设模块名称为opencvtest
),打开opencvtest.xcodeproj
,位于:
yourPathToWorkspace/Appcelerator_Workspace/moduleName/ios/
现在,让我们开始配置模块以接收 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).
- 现在,我们将
opencv2.framework
文件物理复制到 XCode 中项目的 Framework 文件夹中。 (只需将它从 Finder 拖到 XCode)。
DO NOT
忘了 select Copy Items if Needed
.
opencv2.framework
文件将被复制到项目的 /ios
文件夹中。我们需要将它移动到 /ios/platform
文件夹,否则模块会在构建时使应用程序崩溃。
- 现在,我们需要添加 OpenCV 工作所需的一些其他框架(同样,如上述 OpenCV 教程所述)。
为此,我们需要单击 XCode 上的项目名称,然后单击 select Build Phases
并展开 Link Binary with Libraries
。单击 +
图标和 select 以下框架列表,然后将其添加到项目中。它将是这样的:
- 继续,我们需要配置一些东西。首先,点击
Build Settings
并搜索 Other Linker Flags
。然后,打开列表并向其中添加 -lz
。
我们还需要配置Library Search Paths
和Framework Search Paths
。
以下是您应该在每一个中输入的内容:
最后,我们需要创建一个 User-defined build setting
。由于我遇到了一些错误,我在 Whosebug 上找到了这个步骤。这是第 9 步的另一种解决方法。我从 答案中获得了此配置。继续,通过单击 +
和 selecting Add User-Defined Setting
创建设置。
对于它的描述和值,请使用:LD_VERIFY_BITCODE
和 NO
。
- OpenCV 使用
Objective-C++
因此,为了在您的项目中使用该框架,将使用它的 Classes
需要 .mm
而不是 .m
(这告诉编译器正确读取您的代码),因此将其重命名为:
- 现在,由于某些未知原因,我们必须创建一个
.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
文件。做吧。
- 在这一步中,我们将编译模块。为此,请打开
Terminal
应用程序并转到模块的 /ios
文件夹。
然后,输入以下命令:appc run -p ios --build-only
。
构建模块后,我们需要打开 Finder
并转到 dist
模块目录。
/Users/yourUserName/Document/Appcelerator_Workspace/opencvtest/ios/dist/
解压里面的文件,就是模块本身。
- 现在,我们可以使用
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
个步骤。所以,这个答案是为了帮助像我这样的人! =)
由于没有(至少不是很好的)关于使用 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
从一开始,我就从上面的link下载了
SDK 9.2.0
,并安装(粘贴zip文件的内容)到下面的目录:
/Users/yourUserName/Library/Application Support/Titanium/mobilesdk/osx/
modules
文件夹的内容,我贴在:
/Users/yourUserName/Library/Application Support/Titanium/modules
现在,我们需要创建一个新的 Appcelerator 模块,并将 iOS 作为部署目标。
创建模块后(我假设模块名称为
opencvtest
),打开opencvtest.xcodeproj
,位于:
yourPathToWorkspace/Appcelerator_Workspace/moduleName/ios/
现在,让我们开始配置模块以接收
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).
- 现在,我们将
opencv2.framework
文件物理复制到 XCode 中项目的 Framework 文件夹中。 (只需将它从 Finder 拖到 XCode)。
DO NOT
忘了 select Copy Items if Needed
.
opencv2.framework
文件将被复制到项目的 /ios
文件夹中。我们需要将它移动到 /ios/platform
文件夹,否则模块会在构建时使应用程序崩溃。
- 现在,我们需要添加 OpenCV 工作所需的一些其他框架(同样,如上述 OpenCV 教程所述)。
为此,我们需要单击 XCode 上的项目名称,然后单击 selectBuild Phases
并展开Link Binary with Libraries
。单击+
图标和 select 以下框架列表,然后将其添加到项目中。它将是这样的:
- 继续,我们需要配置一些东西。首先,点击
Build Settings
并搜索Other Linker Flags
。然后,打开列表并向其中添加-lz
。
我们还需要配置Library Search Paths
和Framework Search Paths
。
以下是您应该在每一个中输入的内容:
最后,我们需要创建一个 User-defined build setting
。由于我遇到了一些错误,我在 Whosebug 上找到了这个步骤。这是第 9 步的另一种解决方法。我从 +
和 selecting Add User-Defined Setting
创建设置。
对于它的描述和值,请使用:LD_VERIFY_BITCODE
和 NO
。
- OpenCV 使用
Objective-C++
因此,为了在您的项目中使用该框架,将使用它的Classes
需要.mm
而不是.m
(这告诉编译器正确读取您的代码),因此将其重命名为:
- 现在,由于某些未知原因,我们必须创建一个
.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
文件。做吧。
- 在这一步中,我们将编译模块。为此,请打开
Terminal
应用程序并转到模块的/ios
文件夹。
然后,输入以下命令:appc run -p ios --build-only
。 构建模块后,我们需要打开Finder
并转到dist
模块目录。/Users/yourUserName/Document/Appcelerator_Workspace/opencvtest/ios/dist/
解压里面的文件,就是模块本身。
- 现在,我们可以使用
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
个步骤。所以,这个答案是为了帮助像我这样的人! =)