0

我正在开发一个颤振插件,它使用 OpenCV 作为依赖项来进行一些图像处理。我创建了一个桥接并初始化了这里提到的查找功能。基本的 sum 函数有效,但是只要我添加

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. Pod 已安装,应用程序也已运行,但现在我遇到另一个问题,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;
}
4

1 回答 1

1

所以经过几天的研究。在撰写本文时(2020-06-07),我发现在颤振插件代码上拥有静态框架是不可能的(我可能错了)。有关更多详细信息,请查看此处

但这是我解决问题的方法,我将每个自定义.cpp文件复制到我的 Runner 目标并用于dart:ffi从核心目标调用。我需要的 pod 现在也在主 PodFile 上。与 android 相同,将您的 CMakeLists 文件更改为从 iOS 内的 Runner 文件夹中指向 c++ 文件并将它们与 grad 链接

于 2020-06-07T07:39:19.730 回答