如何在 iOS 上将 OpenCV 与 dart:ffi 一起使用
How to use OpenCV with dart:ffi on iOS
我正在开发一个 flutter 插件,它使用 OpenCV 作为依赖项来进行一些图像处理。如 here 中所述,我创建了一个桥接器并初始化了查找函数。基本的求和函数有效,但是只要我添加
s.dependency "OpenCV2"
在我的插件 pod 规范文件中。我的 pod 安装失败
[!] The 'Pods-Runner' target has transitive dependencies that include statically linked binaries: (/.../native_add/example/ios/Pods/OpenCV2/opencv2.framework)
意思是私有 pod 中有一些静态库。因此我启用了
s.static_framework = true
在我的 podspec 文件和 运行 pod install
上。 Pods 已安装,应用程序也在运行,但现在我遇到另一个问题,提示 dart:ffi
无法找到符号。
2020-06-05 15:52:55.419438+0545 Runner[759:830306] [VERBOSE-2:ui_dart_state.cc(157)] Unhandled Exception: Invalid argument(s): Failed to lookup symbol (dlsym(RTLD_DEFAULT, native_add): symbol not found)
#0 DynamicLibrary.lookup (dart:ffi-patch/ffi_dynamic_library_patch.dart:33:29)
#1 nativeAdd (package:native_add/native_add.dart:13:6)
#2 nativeAdd (package:native_add/native_add.dart:12:34)
那么如何让 dart:ffi
在启用 static_framework 的同时找到符号。与 dart:ffi
.
相关的资源很少
更新
查找函数:
final DynamicLibrary nativeAddLib = Platform.isAndroid
? DynamicLibrary.open("libnative_add.so")
: DynamicLibrary.process();
final int Function(int x, int y) nativeAdd = nativeAddLib
.lookup<NativeFunction<Int32 Function(Int32, Int32)>>("native_add")
.asFunction();
C++ 函数
extern "C" __attribute__((visibility("default"))) __attribute__((used))
int32_t native_add(int32_t x, int32_t y) {
return x + y;
}
所以经过几天的研究。在撰写本文时(2020-06-07),我发现在 flutter 插件代码上使用静态框架是不可能的(我可能是错的)。更多详情 check here
但这是我解决问题的方法,我将每个自定义 .cpp
文件复制到我的 Runner 目标并使用 dart:ffi
从核心目标调用。另外,我需要的 pod 现在位于主 PodFile 上。与 android 相同,将您的 CMakeLists 文件更改为指向 iOS 和 link 内 Runner 文件夹中的 c++ 文件,并使用 grad
我正在开发一个 flutter 插件,它使用 OpenCV 作为依赖项来进行一些图像处理。如 here 中所述,我创建了一个桥接器并初始化了查找函数。基本的求和函数有效,但是只要我添加
s.dependency "OpenCV2"
在我的插件 pod 规范文件中。我的 pod 安装失败
[!] The 'Pods-Runner' target has transitive dependencies that include statically linked binaries: (/.../native_add/example/ios/Pods/OpenCV2/opencv2.framework)
意思是私有 pod 中有一些静态库。因此我启用了
s.static_framework = true
在我的 podspec 文件和 运行 pod install
上。 Pods 已安装,应用程序也在运行,但现在我遇到另一个问题,提示 dart:ffi
无法找到符号。
2020-06-05 15:52:55.419438+0545 Runner[759:830306] [VERBOSE-2:ui_dart_state.cc(157)] Unhandled Exception: Invalid argument(s): Failed to lookup symbol (dlsym(RTLD_DEFAULT, native_add): symbol not found)
#0 DynamicLibrary.lookup (dart:ffi-patch/ffi_dynamic_library_patch.dart:33:29)
#1 nativeAdd (package:native_add/native_add.dart:13:6)
#2 nativeAdd (package:native_add/native_add.dart:12:34)
那么如何让 dart:ffi
在启用 static_framework 的同时找到符号。与 dart:ffi
.
更新
查找函数:
final DynamicLibrary nativeAddLib = Platform.isAndroid
? DynamicLibrary.open("libnative_add.so")
: DynamicLibrary.process();
final int Function(int x, int y) nativeAdd = nativeAddLib
.lookup<NativeFunction<Int32 Function(Int32, Int32)>>("native_add")
.asFunction();
C++ 函数
extern "C" __attribute__((visibility("default"))) __attribute__((used))
int32_t native_add(int32_t x, int32_t y) {
return x + y;
}
所以经过几天的研究。在撰写本文时(2020-06-07),我发现在 flutter 插件代码上使用静态框架是不可能的(我可能是错的)。更多详情 check here
但这是我解决问题的方法,我将每个自定义 .cpp
文件复制到我的 Runner 目标并使用 dart:ffi
从核心目标调用。另外,我需要的 pod 现在位于主 PodFile 上。与 android 相同,将您的 CMakeLists 文件更改为指向 iOS 和 link 内 Runner 文件夹中的 c++ 文件,并使用 grad