微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 Dart::ffi 使用原生函数测试颤振包中的库函数

如何解决使用 Dart::ffi 使用原生函数测试颤振包中的库函数

我正在编写一个 Dart 库来使用 Flutter 访问 C 共享对象。

到目前为止,我创建的示例应用程序按预期工作(在某种程度上),但我想包括单元测试,以保持库的稳定性。

详情:

  • 共享对象位于 APP/android/src/main/jniLibs/{abi}/liboqs.so
  • example/lib/main.dart 中的示例应用程序并按预期工作
  • 库在 APP/lib/liboqs_Flutter.dart

图书馆使用

  static final ffi.DynamicLibrary _liboqs = Platform.isAndroid
      ? ffi.DynamicLibrary.open("liboqs.so")
      : ffi.DynamicLibrary.process();

设置库。

但是当我尝试使用 Flutter_test 访问这个库时(例如运行运行静态最终 C 本机函数 OQS_init 的初始化函数 LiboqsFlutter.init(),我得到:

Failed to load "/{HOME DIRECTOR}/liboqs_Flutter/test/liboqs_Flutter_test.dart": Invalid argument(s): Failed to lookup symbol (dlsym(RTLD_DEFAULT,OQS_init): symbol not found)

我知道 Flutter 测试无法访问“主要”资产,但我如何强制通过它,以便正确测试我的代码

这个issue offers two solutions

但我并不完全明白如何让这些对我有用。颤振驱动程序如何帮助我? #2 代码应该添加到测试中还是原始库中并在测试中调用?如果我已经在 main/jniLibs 文件夹中预先构建了共享对象,那么在测试时是否真的需要重建项目?这似乎浪费了很多时间来测试应用程序。

解决方法

在 Android Studio 中进行测试可以通过以下两种方式之一进行。 1) 在手机或模拟器环境中或 2) 在桌面上。我正在构建一个 Flutter 包,所以我有一个在手机上测试的示例,以及一个在我的开发环境(桌面)上测试的 Dart 库。

我正在寻找的配置在桌面上。因此,我需要为我的 (Mac) 环境编译共享对象 (.dylib),将其包含在构建/测试文件夹中,并像这样调用它:

static ffi.DynamicLibrary _open() {
    if (Platform.environment.containsKey('FLUTTER_TEST')) {
      return ffi.DynamicLibrary.open('build/test/{clibrary}.dylib');
    } else {
      return Platform.isAndroid
          ? ffi.DynamicLibrary.open("liboqs.so")
          : ffi.DynamicLibrary.process();
    }
  }

为了完整起见,首先检测操作系统然后提供适当的共享对象文件是有意义的。

这将确保您拥有可用于单元测试的共享对象。

flutter drive 选项出于相同目的使用集成测试。我认为添加一些 hacky 代码比添加另一个仅用于测试的依赖项更好。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?