455 字
2 分钟

Flutter + C++ FFI 示例教程 (Android 平台)

封面来源

ukishizumi-かきました🧸🎀

1. 创建 Flutter 项目#

Terminal window
flutter create flutter_cpp_demo
cd flutter_cpp_android_demo

2. 添加必要的依赖#

Terminal window
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 __cplusplus
extern "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

运行生成绑定代码:

Terminal window
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. 构建和运行#

Terminal window
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/
作者
mengh04
发布于
2025-04-07
许可协议
CC BY-NC-SA 4.0