455 字
2 分钟
Flutter + C++ FFI 示例教程 (Android 平台)

封面来源
1. 创建 Flutter 项目
flutter create flutter_cpp_democd flutter_cpp_android_demo
2. 添加必要的依赖
flutter pub add ffigen
3. 创建 C++ 文件
在项目根目录下创建 native/src/add.cpp
:
#include <stdint.h>
extern "C" { int32_t add(int32_t a, int32_t b) { return a + b; }}
4. 创建头文件 (用于 ffigen)
创建 native/include/add.h
:
#ifndef ADD_H#define ADD_H
#ifdef __cplusplusextern "C" {#endif
int32_t add(int32_t a, int32_t b);
#ifdef __cplusplus}#endif
#endif
5. 配置 ffigen
在项目根目录创建 ffigen.yaml
:
name: 'NativeAddBindings'description: 'Bindings to native add function'output: 'lib/generated_bindings.dart'headers: entry-points: - 'native/include/add.h' include-directives: - 'native/include/add.h'preamble: | // ignore_for_file: always_specify_types // ignore_for_file: camel_case_types // ignore_for_file: non_constant_identifier_names
运行生成绑定代码:
flutter pub run ffigen
这将在 lib/generated_bindings.dart
生成绑定代码。
6. 配置 Android 的 CMake
在 android/app/src/main/cpp/CMakeLists.txt
(如不存在则创建):
cmake_minimum_required(VERSION 3.4.1)
# 添加你的源文件add_library(native_add SHARED ../../../../../native/src/add.cpp)
# 包含头文件目录target_include_directories(native_add PRIVATE ../../../../../native/include)
find_library(log-lib log)
target_link_libraries(native_add ${log-lib})
7. 修改 Android 的 build.gradle.kts
修改 android/app/build.gradle.kts
:
android { // ... defaultConfig { // ... externalNativeBuild { cmake { cppFlags.add("-std=c++17") arguments.add("-DANDROID_STL=c++_shared") } } } // ... externalNativeBuild { cmake { path = file("src/main/cpp/CMakeLists.txt") version = "3.22.1" } } // ...}
8. 创建 Dart 封装
创建 lib/native_add.dart
:
import 'dart:ffi';import 'dart:io';
import 'generated_bindings.dart';
class NativeAdd { static final DynamicLibrary _library = () { if (Platform.isAndroid) { return DynamicLibrary.open('libnative_add.so'); } else if (Platform.isIOS) { return DynamicLibrary.process(); } throw UnsupportedError('Platform not supported'); }();
static final NativeAddBindings _bindings = NativeAddBindings(_library);
static int add(int a, int b) => _bindings.add(a, b);}
9. 使用示例
修改 lib/main.dart
:
import 'package:flutter/material.dart';import 'native_add.dart';
void main() { runApp(const MyApp());}
class MyApp extends StatelessWidget { const MyApp({super.key});
@override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar(title: const Text('Flutter + C++ Example')), body: Center( child: Text( '3 + 5 = ${NativeAdd.add(3, 5)}', style: const TextStyle(fontSize: 24), ), ), ), ); }}
10. 构建和运行
flutter run
完整项目结构
flutter_cpp_example/├── android/│ └── app/│ └── src/│ └── main/│ ├── cpp/│ │ └── CMakeLists.txt│ └── java/├── lib/│ ├── generated_bindings.dart│ ├── native_add.dart│ └── main.dart├── native/│ ├── include/│ │ └── add.h│ └── src/│ └── add.cpp├── pubspec.yaml└── ffigen.yaml
Flutter + C++ FFI 示例教程 (Android 平台)
https://blog.mengh04.top/posts/flutter-with-c-with-android/