我将首先描述我使用的所有软件的配置、版本和其他内容。
Appcelerator Titanium Mobile SDK - 9.2.0
Appcelerator CLI - 8.0.0
XCode 11.3.1
Mac OSX Mojave - 10.14.6
OpenCV - 4.4.0
-
从一开始,我就从上面的链接下载了SDK 9.2.0,并将其安装(粘贴了zip文件的内容)到以下目录:
/Users/yourUserName/Library/Application Support/Titanium/mobilesdk/osx/
modules 文件夹的内容,我粘贴到:
/Users/yourUserName/Library/Application Support/Titanium/modules
-
现在,我们需要创建一个以 iOS 为部署目标的新 Appcelerator 模块。
-
模块创建后(我假设模块名称为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忘记选择Copy Items if Needed。
opencv2.framework 文件将被复制到项目的/ios 文件夹中。我们需要将其移动到/ios/platform 文件夹,否则该模块会在构建时使应用崩溃。
- 现在,我们需要添加一些 OpenCV 需要的其他框架才能正常工作(同样,如上面提到的 OpenCV 教程中所述)。
为此,我们需要在 XCode 上单击项目名称,然后选择 Build Phases 并展开 Link Binary with Libraries。单击+ 图标并选择以下框架列表,然后将其添加到项目中。会是这样的:
- 继续,我们需要配置一些东西。首先,点击
Build Settings 并搜索Other Linker Flags。然后,打开列表并将-lz添加到其中。
我们还需要配置Library Search Paths和Framework Search Paths。
这是你应该在每一个中添加的内容:
最后,我们需要创建一个User-defined build setting。由于我遇到了一些错误,我在 StackOverflow 上找到了这一步。这是第 9 步的另一种解决方法。我从this 答案中获得了此配置。继续,通过单击 + 并选择 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'。很多人在 StackOverflow 上谈论这个错误,最常见的解决方法之一是使用 bridging header 创建 swift 文件。所以,让我们这样做吧。
右键单击项目名称并选择New File。
然后,选择 Swift 文件。
选择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。
我选择了经典(非合金)和Default Project,并使用了下面的配置:
还记得第 10 步中的 .zip 文件吗?获取它创建的名为 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 步骤。所以,这个答案是为了帮助像我这样的人! =)