flutter 通过使用FFi调用c代码

7 min read

Flutter通过使用FFI库可以调用C代码。FFI(Foreign Function Interface)是一个Flutter中的库,它允许Flutter应用程序与本地代码(如C、C++、Rust等)进行交互。FFI使用dart:ffi包来实现这一功能。

要使用FFI,在Flutter应用程序中需要进行以下步骤:

  1. 定义C函数声明。

在Dart程序中,需要将要调用的C函数声明为extern函数。这些声明应包含函数名称、输入参数类型和返回值类型。以下是一个示例声明:

import 'dart:ffi' as ffi;

typedef SumFunc = ffi.Int32 Function(ffi.Int32 a, ffi.Int32 b);
typedef Sum = int Function(int a, int b);
final sumPointer = ffi.DynamicLibrary.open("libsum.so")
    .lookup<ffi.NativeFunction<SumFunc>>("sum")
    .asFunction<Sum>();
  1. 加载本地动态库。

在Flutter应用程序中,需要通过ffi库的DynamicLibrary方法加载本地动态库。此方法的参数是要加载的库的名称或路径。以下是一个示例:

final myLib = ffi.DynamicLibrary.open('mylib.so');
  1. 获取C函数指针。

在Flutter应用程序中,需要通过ffi库的DynamicLibrary.lookup方法获取C函数的指针。此方法的参数是要获取的函数的名称。以下是一个示例:

final myFuncPointer = myLib.lookupFunction<NativeFunction<MyFunc>, MyFunc>('my_function');
  1. 调用C函数。

在Flutter应用程序中,需要使用指针调用C函数。这可以通过将C函数指针转换为Dart函数指针来完成。通过ffi库的asFunction方法可以实现这一点。以下是一个示例:

myFuncPointer.asFunction<ResultType Function(ParamType1, ParamType2)>()(param1, param2);