[Dart笔记]dart:ffi与dart:ffigen实用指南

2,439 阅读1分钟

适用范围

  • 移动平台:Android/iOS
  • 桌面平台:Windows/macOS/Linux
  • 其他:Fuchsia

官方文档

ffigen使用方法

示例: github.com/woodemi/lib…

其中包装并使用了 github.com/libusb/libu… 实现macOS/Linux端USB连接功能

环境

  • Windows(10)
  • macOS
  • Linux(Ubuntu 18.04 LTS)

编译

准备llvm(9+)

  • Windows: winget install -e --id LLVM.LLVM
  • macOS: brew install llvm
  • Linux: sudo apt install libclang-10-dev

编译libusb_xxx.dart

  • Windows/Linux:
pub run ffigen
move lib/libusb.dart lib/libusb64.dart

Refactor timeval to timeval64

  • macOS:
pub run ffigen
mv lib/libusb.dart lib/libusb32.dart

Refactor timeval to timeval32

贡献更新

准备libusb.h

Download xxx verion from github.com/libusb/libu… and extract libusb.h

准备libusb-1.0动态/静态库

copy libusb-1.0.23\MS64\dll\libusb-1.0.dll libusb-1.0\
cp libusb/1.0.23/lib/libusb-1.0.dylib libusb-1.0/
cp /lib/x86_64-linux-gnu/libusb-1.0.so.0.xxx libusb-1.0/libusb-1.0.so

打包

  • Android 把动态库放到app/src/main/jniLibs下,按照架构分类
- jniLibs
  - armabi
  - armabi-v7
  - arm64-v8a
  - x86
  • iOS 因为审核原因无法使用dlopen相关API,需要打包.a静态库到程序中

  • Windows/Linux

# List of absolute paths to libraries that should be bundled with the plugin
set(quick_usb_bundled_libraries
  "${CMAKE_CURRENT_SOURCE_DIR}/libusb-1.0.23.dll"
  PARENT_SCOPE
)
  • macOS
Pod::Spec.new do |s|
# ...
  s.vendored_libraries = 'libusb-1.0.23.dylib'
# ...
end

现有问题