ios - 使用 OpenCV 框架的 Appcelerator iOS 模块的循序渐进
问题描述
由于没有(至少不好)关于使用 OpenCV 框架的 Appcelerator iOS 模块的实现的文档,我决定提出这个问题并用我能做到的最完整的细节来回答它,以供进一步参考。
我希望它可以帮助其他人,所以他们不会像我一样挣扎很长时间(花了我一个多月的时间才成功编译模块并能够在 App 上运行它)。
在开始之前,我要感谢TiSlack的人们,他们在一些关键点上帮助了我。
解决方案
我将从描述我使用的所有软件的配置、版本和其他内容开始。
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
从一开始,我就
SDK 9.2.0
从上面的链接下载了它,并将它(粘贴了 zip 文件的内容)安装在以下目录中:文件夹
/Users/yourUserName/Library/Application Support/Titanium/mobilesdk/osx/
的内容modules
,我粘贴在:
/Users/yourUserName/Library/Application Support/Titanium/modules
创建模块后(我将假设模块的名称为
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
零件,否则会出现一些编译错误(如OpenCV 教程中所述)。NEEDS
BEFORE
__OBJC__
- 现在,我们将
opencv2.framework
文件物理复制到 XCode 中项目的 Framework 文件夹中。(只需将它从 Finder 拖到 XCode 中)。
DO NOT
忘记选择Copy Items if Needed
。
该opencv2.framework
文件将被复制到/ios
项目的文件夹中。我们需要将它移动到该/ios/platform
文件夹中,否则该模块会在构建时使 App 崩溃。
- 现在,我们需要添加一些 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 步的另一种解决方法。我从这个答案中得到了这个配置。继续,通过单击+
并选择创建设置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 上谈论这个错误,最常见的解决方法之一是swift
使用bridging header
. 所以,让我们这样做。
右键单击项目名称并选择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
.
我选择了 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
一步。所以,这个答案是为了帮助像我这样的人!=)
推荐阅读
- ruby-on-rails - 从 Word 文档中提取页码 - Ruby on Rails
- python - 熊猫,分组并将多个列值聚合到一个字典中
- react-native - Expo v30.0 的 React-native-svg 使用问题
- sqlite - 从一个表中选择值,从另一个表中计算公共值,如果没有公共值则显示 0
- java - JAVA JDBC mySql Prepared statement 更新查询
- mysql - 终端错误中的 SQL:不匹配的输入“)”期望(在原始类型规范中靠近“VARCHAR”
- android - Android:如何在按钮单击时隐藏标题栏
- python - 为什么tesseract没有在python中加载
- c# - ReaderWriterLockSlim 与 LockRecursionPolicy.SupportsRecursion 与锁
- actionscript-3 - 如何在 ActionScript 3 中不满足结束游戏条件时循环播放背景音乐?