如何为Flutter Windows应用集成原生OpenCV库?附动态库创建指南
Flutter Windows集成原生OpenCV库(含获取版本示例)
准备工作
- 下载安装OpenCV Windows版(推荐选择包含
opencv_worldxxx.dll的发行版,例如4.8.0),记录安装路径(如C:\opencv) - 确保Flutter已配置Windows开发环境(执行
flutter doctor验证)
步骤1:创建OpenCV封装动态库
1.1 新建原生项目结构
创建名为opencv_native的文件夹,添加以下两个文件:
opencv_wrapper.cpp(封装OpenCV接口)
#include <opencv2/core/version.hpp> #include <cstdlib> #include <cstring> // 使用extern "C"避免C++名字修饰,确保Dart能正确找到函数 extern "C" { // 返回OpenCV版本字符串,内存由malloc分配,需调用free_memory释放 const char* get_opencv_version() { const char* version_str = CV_VERSION; char* allocated_str = (char*)malloc(strlen(version_str) + 1); strcpy(allocated_str, version_str); return allocated_str; } // 供Dart调用释放内存的函数 void free_memory(char* ptr) { free(ptr); } }
CMakeLists.txt(编译配置)
cmake_minimum_required(VERSION 3.10) project(opencv_native) # 指定C++标准 set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) # 替换为你的OpenCV安装路径 set(OpenCV_DIR "C:/opencv/build") find_package(OpenCV REQUIRED) # 生成动态库 add_library(opencv_native SHARED opencv_wrapper.cpp) # 链接OpenCV依赖库 target_link_libraries(opencv_native ${OpenCV_LIBS}) # 设置动态库输出目录,方便后续拷贝 set_target_properties(opencv_native PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/output )
1.2 编译动态库
- 打开CMake GUI,选择
opencv_native为源代码目录,新建build文件夹作为编译目录 - 点击Configure,选择对应版本的Visual Studio(如2022 x64),完成配置
- 点击Generate,然后选择Open Project打开Visual Studio
- 选择
Release模式编译项目,编译完成后,output/Release目录会生成opencv_native.dll - 从OpenCV安装目录(如
C:\opencv\build\x64\vc16\bin)拷贝对应版本的opencv_worldxxx.dll到output/Release目录
步骤2:Flutter项目集成与FFI调用
2.1 拷贝动态库到Flutter项目
将opencv_native.dll和opencv_worldxxx.dll拷贝到Flutter项目的windows/runner/Release目录(Debug模式则拷贝到windows/runner/Debug,需对应使用OpenCV的Debug版库)
2.2 编写Dart FFI代码
在lib目录下新建opencv_ffi.dart:
import 'dart:ffi'; import 'dart:io'; import 'package:ffi/ffi.dart'; // 加载动态库 final DynamicLibrary _opencvLib = Platform.isWindows ? DynamicLibrary.open('opencv_native.dll') : throw UnsupportedError('仅支持Windows平台'); // 定义函数签名 typedef _GetVersionFunc = Pointer<Utf8> Function(); typedef _GetVersion = Pointer<Utf8> Function(); typedef _FreeMemoryFunc = Void Function(Pointer<Utf8>); typedef _FreeMemory = void Function(Pointer<Utf8>); // 获取函数指针 final _getVersion = _opencvLib.lookupFunction<_GetVersionFunc, _GetVersion>('get_opencv_version'); final _freeMemory = _opencvLib.lookupFunction<_FreeMemoryFunc, _FreeMemory>('free_memory'); // 封装调用方法,自动处理内存释放 String getOpenCVVersion() { final versionPtr = _getVersion(); final version = versionPtr.toDartString(); _freeMemory(versionPtr); // 释放C层分配的内存 return version; }
2.3 在Flutter界面中调用
修改lib/main.dart:
import 'package:flutter/material.dart'; import 'opencv_ffi.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('OpenCV版本查询')), body: Center( child: FutureBuilder<String>( future: Future.value(getOpenCVVersion()), builder: (context, snapshot) { if (snapshot.hasData) { return Text('OpenCV版本:${snapshot.data}'); } else if (snapshot.hasError) { return Text('错误:${snapshot.error}'); } return const CircularProgressIndicator(); }, ), ), ), ); } }
步骤3:运行项目
执行以下命令启动Flutter Windows应用:
flutter run -d windows
界面将显示当前集成的OpenCV版本号。
内容的提问来源于stack exchange,提问作者Ibne
相关产品推荐
相关产品推荐

