Flutter混合开发中如何通过源码模式引入C模块

在Flutter混合开发项目中,如何通过源码模式引入C语言编写的原生模块?具体需要修改哪些配置文件,以及如何正确配置CMake或Android.mk来确保Flutter能正确编译和调用C代码?最好能提供详细的步骤示例。

2 回复

在Flutter混合开发中,通过源码模式引入C模块需以下步骤:

  1. pubspec.yaml中添加ffi依赖。
  2. 创建C源码文件,如native_add.c
  3. CMakeLists.txtAndroid.mk中配置C模块编译。
  4. 使用dart:ffi加载动态库并调用C函数。

示例:

dependencies:
  ffi: ^2.0.1

更多关于Flutter混合开发中如何通过源码模式引入C模块的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter混合开发中,通过源码模式引入C模块(如C/C++代码)通常使用FFI(Foreign Function Interface)机制,结合平台通道或直接在Dart中调用。以下是详细步骤:

1. 编写C代码

创建C头文件(.h)和源文件(.c):

// native_lib.h
#ifdef _WIN32
#define EXPORT __declspec(dllexport)
#else
#define EXPORT
#endif

EXPORT int add(int a, int b);

// native_lib.c
#include "native_lib.h"
EXPORT int add(int a, int b) {
    return a + b;
}

2. 编译为动态库

  • Android:使用Android NDK编译为.so文件。
  • iOS:使用Xcode编译为.dylib或通过iOS项目配置。
  • Windows/Linux:使用GCC或MSVC编译为.dll.so

示例Android NDK编译命令(在项目android目录下):

ndk-build NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=./Android.mk

其中Android.mk需配置源文件路径。

3. 在Flutter中配置FFI

添加ffi依赖到pubspec.yaml

dependencies:
  ffi: ^2.0.1

4. 加载动态库并调用函数

在Dart文件中使用dart:ffi

import 'dart:ffi';
import 'package:ffi/ffi.dart';

// 加载动态库(路径根据平台调整)
final DynamicLibrary nativeLib = Platform.isAndroid
    ? DynamicLibrary.open('libnative_lib.so')
    : DynamicLibrary.process();

// 定义C函数签名
typedef AddFunc = Int32 Function(Int32 a, Int32 b);
typedef Add = int Function(int a, int b);

// 获取函数指针
final Add add = nativeLib
    .lookup<NativeFunction<AddFunc>>('add')
    .asFunction<Add>();

// 调用C函数
void main() {
  print('Result: ${add(3, 5)}'); // 输出: Result: 8
}

5. 平台特定配置

  • Android:将.so文件放入android/app/src/main/jniLibs/对应ABI目录。
  • iOS:在Xcode中添加源文件并配置编译规则,或直接链接动态库。

注意事项

  • 确保动态库路径正确,且与平台匹配。
  • 处理内存管理(如使用allocate/free时需手动释放)。
  • 对于复杂数据类型(如结构体),需在Dart中定义相应类型。

通过以上步骤,即可在Flutter混合开发中通过源码模式集成C模块。

回到顶部