如何在 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