Flutter混合开发中如何通过源码模式引入C模块
在Flutter混合开发项目中,如何通过源码模式引入C语言编写的原生模块?具体需要修改哪些配置文件,以及如何正确配置CMake或Android.mk来确保Flutter能正确编译和调用C代码?最好能提供详细的步骤示例。
2 回复
在Flutter混合开发中,通过源码模式引入C模块需以下步骤:
- 在
pubspec.yaml中添加ffi依赖。 - 创建C源码文件,如
native_add.c。 - 在
CMakeLists.txt或Android.mk中配置C模块编译。 - 使用
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模块。

