Contents

C interop using dart:ffi

Dart Native平台上运行的Dart移动,命令行和服务器应用程序可以使用dart:ffi库来调用本机C API. FFI代表外来功能接口. 类似功能的其他术语包括本机界面语言绑定.

API documentation is available from the dev channel: dart:ffi API reference.

Examples

以下示例显示了如何使用dart:ffi库:

Example Description
hello_world 如何在没有参数且没有返回值的情况下调用C函数.
primitives 如何调用具有参数并返回为整数或指针的值的C函数. 还演示了varargs .
structs 如何使用结构在C和C之间传递字符串以及如何处理简单和复杂的C结构 .
sqllite 迷你教程随附的Dart SDK存储库中的示例.

Walkthrough of hello_world

hello_world示例具有调用C库的最少必需代码.

Files

hello_world示例包含以下文件:

源文件 Description
hello.dart 使用C库中的hello_world()函数的Dart文件.
pubspec.yaml 常见的Dart pubspec ,SDK的下限至少为2.5.
hello_library/hello.h 声明hello_world()函数.
hello_library/hello.c 导入hello.h并定义hello_world()函数的AC文件.
hello_library/CMakeLists.txt CMake构建文件,用于将C代码编译到动态库中.

构建C库会创建几个文件,包括一个名为libhello.dylib (macOS), libhello.dll (Windows)或libhello.so (Linux)的动态库文件.

Building and running

这是构建动态库并执行Dart应用程序的示例:

$ cd hello_library
$ cmake .
...
$ make
...
$ cd ..
$ dart hello.dart
Hello World

Using dart:ffi

hello.dart文件说明了使用dart:ffi调用C函数的步骤:

  1. 导入dart:ffi.
  2. 使用C函数的FFI类型签名创建一个typedef.
  3. 为调用C函数时要使用的变量创建一个typedef.
  4. 打开包含C函数的动态库.
  5. 获取对C函数的引用,并将其放入变量中.
  6. 调用C函数.

这是每个步骤的代码.

  1. 导入dart:ffi.
     import 'dart:ffi' as ffi ; 
  2. 使用C函数的FFI类型签名创建一个typedef.
    dart:ffi库定义的常用类型包括DoubleInt32NativeFunctionPointerStructUint8Void .
     typedef hello_world_func = ffi . Void Function (); 
  3. 为调用C函数时要使用的变量创建一个typedef.
     typedef HelloWorld = void Function (); 
  4. 打开包含C函数的动态库.
     final dylib = ffi . DynamicLibrary . open ( 'hello_world.dylib' ); 
  5. 获取对C函数的引用,并将其放入变量中. 该代码使用步骤2和3中定义的typedef,以及步骤4中的动态库变量.
     final HelloWorld hello = dylib . lookup < ffi . NativeFunction < hello_world_func >>( 'hello_world' ) . asFunction (); 
  6. 调用C函数.
     hello (); 

了解hello_world示例后,您应该准备看看其他dart:ffi示例 .

Bundling and loading C libraries

如何将C库与包或应用程序捆绑(或打包分发 ),然后加载该库取决于您的平台和库的类型. 有关详细信息,请参见以下内容:

by  ICOPY.SITE