【Flutter】Flutter C/C++ 插件的开发 (支持 windows、macos、ios、android )
一个各平台调用 C/C++ 源码的例子,如何共享代码,配置相关的编译
官方的例子:https://docs.flutter.dev/development/platform-integration/c-interop
源码地址:https://github.com/gaoshang212/flutter_native_demo
创建一个插件
可以执行下面的命令来创建一个插件
flutter create --template=plugin --platforms=windows,macos,ios,android,linux flutter_native_demo
--platforms 可以指定支持哪些平台,如 windows,macos,ios,android,linux
如果没有创建相应平台目录,可以使用下面的命令开启相应的平台
flutter config --enable-linux-desktop # 开启linux 桌面
flutter config --enable-macos-desktop # 开启macos 桌面
flutter config --enable-ios # 开启ios
# 更多的命令可以通过help查看
flutter config --help
如果有字符串操作或转换,可以添加 ffi 的包:
flutter pub add ffi
项目结构

添加 C/C++ 源码文件
很多时候我们各平台是会共用一套C/C++ 源码的,我们先创建一个源码,就按官网的来,但我们创建在一个公共目录(官网创建在IOS/Classes下面)
libs/native_add/native_add.cpp
#include <stdint.h>
#ifdef WIN32
#define DART_API extern "C" __declspec(dllexport)
#else
#define DART_API extern "C" __attribute__((visibility("default"))) __attribute__((used))
#endif
DART_API int32_t native_add(int32_t x, int32_t y) {
return x + y;
}
Dart
在 lib/flutter_native_demo.dart 中添加动态库的调用代码
final DynamicLibrary nativeAddLib = Platform.isMacOS || Platform.isIOS
? DynamicLibrary.process()
: DynamicLibrary.open('libNativeAdd.${Platform.isWindows ? 'dll' : 'so'}');
final int Function(int x, int y) nativeAdd = nativeAddLib
.lookup<NativeFunction<Int32 Function(Int32, Int32)>>('native_add')
.asFunction();
我们改一下 example/lib/main.dart 的代码
// 修改一下 platformVersion 的赋值
platformVersion = nativeAdd(1, 2).toString();
Windows 配置
在 libs/native_add 目录中添加一个 CMakeLists.txt ,用来编译 动态库。
cmake_minimum_required(VERSION 3.4)
# 项目名称
set(PROJECT_NAME "libNativeAdd")
project(${PROJECT_NAME} LANGUAGES CXX)
# 源文件
add_library(${PROJECT_NAME} SHARED
"./native_add.cpp"
)
# 动态库的输出目录
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/$<$<CONFIG:DEBUG>:Debug>$<$<CONFIG:RELEASE>:Release>")
# 安装动态库的目标目录
set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}")
# 安装动态库,到执行目录
install(FILES "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${PROJECT_NAME}.dll" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" COMPONENT Runtime)
在 windows 目录下面的 CMakeLists.txt 中添加相应的子目录
add_subdirectory("../libs/native_add" native_add)
在 example 目录下面执行下面的命令,来运行程序.
cd example
flutter run -d windows -v
Android 配置
安卓的动态库,会自动添加lib头,我们改造一下 libs/native_add/CMakeLists.txt 让他兼容windows和 android
cmake_minimum_required(VERSION 3.4)
# 项目名称
if (${CMAKE_SYSTEM_NAME} EQUAL "Windows")
set(PROJECT_NAME "libNativeAdd")
else()
set(PROJECT_NAME "NativeAdd")
endif()
project(${PROJECT_NAME} LANGUAGES CXX)
# 源文件
add_library(${PROJECT_NAME} SHARED
"./native_add.cpp"
)
# Windows 需要把dll拷贝到bin目录
IF (WIN32)
# 动态库的输出目录
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/$<$<CONFIG:DEBUG>:Debug>$<$<CONFIG:RELEASE>:Release>")
# 安装动态库的目标目录
set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}")
# 安装动态库,到执行目录
install(FILES "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${PROJECT_NAME}.dll" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" COMPONENT Runtime)
ENDIF()
在 android/build.gradle 文件中添加 CMakeList.txt 路径
android {
externalNativeBuild {
// Encapsulates your CMake build configurations.
cmake {
// 指定一个CMake 编译脚本的相对目录。
path "../libs/native_add/CMakeLists.txt"
}
}
}
在 example 目录下面执行下面的命令,来运行程序
cd example
flutter run -d <android> -v
说明:可以用 flutter devices 查看支持设备,来替换 。
macOS 配置
在 macos/Classes 目录中执行下面的命令,给macOS link 相关的代码
ln -s ../../libs/native_add/native_add.cpp ./
然后回到 example 目录中执行
flutter run -d macos -v
说明:国内使用时会,通过 CocoaPods 安装包会很慢,可以切换到 清华的镜像。设置 example 目录下macos 的 Podfile。
IOS 配置
IOS 和 macOS 的配置基本是一样的,注意一下目录就好了。
执行效果


【Flutter】Flutter C/C++ 插件的开发 (支持 windows、macos、ios、android )的更多相关文章
- 【Linux】Mac好用虚拟机 Parallels Desktop、FinalShell-多终端连接工具(支持Windows,macOS,Linux)
一.Mac好用虚拟机 Parallels Desktop 1.下载安装: 2.新建虚拟机: 3.配置管理: 二.FinalShell-多终端连接工具(支持Windows,macOS,Linux) 1. ...
- .NET MVC插件化开发(支持Script和css压缩)
上一篇博文里面,没有支持Script和css的压缩功能以及script和css的路径问题也没有解决,所以重新发布一个版本,解决了这几个问题,并且优化了插件路由注册,现在可以很方便的实现热插拔web插件 ...
- Scrcpy用电脑控制Android手机(支持Windows/macOS/Linux)
一.scrcpy简介 注意:拼写是scrcpy,非Python爬虫框架Scrapy. scrcpy可以通过adb调试的方式来将手机屏幕投到电脑上,并可以通过电脑控制您的Android设备.它可以通过U ...
- LiveBlox无需代码的开发工具--支持win macos ubuntu等开发环境--
LiveBlox无需代码的开发工具-支持windows macos ubuntu. 强大 灵活 易于使用 视频简介:LiveBlox Develop Technology Without Coding ...
- 谷歌发布Flutter Alpha:支持Windows
老孟导读:Windows来了,Mac.Linux.Web还远吗? 本文翻译自https://medium.com/flutter/announcing-flutter-windows-alpha-33 ...
- Flutter - flutter desktop embedding / flutter 桌面支持
2019年5月9日,随着谷歌在IO19宣布Flutter支持Web平台,就标志着Flutter已经全面支持所有平台(移动.网页.桌面.嵌入式). 现编一个跨平台小段子: 微软Xarmarin:喵喵喵? ...
- nopCommerce 3.9 大波浪系列 之 开发支持多店的插件
一.基础介绍 nop支持多店及多语言,本篇结合NivoSlider插件介绍下如何开发支持多商城的小部件. 主要接口如下: ISettingService 接口:设置接口,可实现多店配置. (点击接口介 ...
- Flutter学习(一)——搭建开发环境(Windows)
久闻 Flutter 大名,今天终于有时间体验一下了 ٩(๑>◡<๑)۶ 官网:https://flutter.dev/ 中文官网:https://flutterchina.club/ 一 ...
- 大熊君JavaScript插件化开发------(第一季)
一,开篇分析 Hi,大家!大熊君又来了,今天这系列文章主要是说说如何开发基于“JavaScript”的插件式开发,我想很多人对”插件“这个词并不陌生, 有的人可能叫“组件”或“部件”,这不重要,关键是 ...
随机推荐
- Codeforces Round #773 (Div. 2)D,E
D. Repetitions Decoding 传送门 题目大意: 一个长为 n ( n 2 ≤ 250000 ) n(n^2\leq250000) n(n2≤250000)的序列,每个元素 a i ...
- 熟悉JSP教程学习
- SpringBoot进阶教程(七十三)整合elasticsearch
Elasticsearch 是一个分布式.高扩展.高实时的搜索与数据分析引擎.它能很方便的使大量数据具有搜索.分析和探索的能力.充分利用Elasticsearch的水平伸缩性,能使数据在生产环境变得更 ...
- jieba:统计一篇文章中词语数
jieba官方文档 1.jieba分词的四种模式 精确模式.全模式.搜索引擎模式.paddle模式 精确模式:把文本精确的切分开,不存在冗余单词,适合文本分析: 全模式:把文本中所有可能的词语都扫描出 ...
- 串口通信 之 linux固定串口别名的两种方法
转载:https://blog.csdn.net/beiguodexuecsdn/article/details/103099456 最近阅读的好文:https://blog.csdn.net/mrd ...
- UML类图的补充及软件设计原则
UML类图的补充及软件设计原则 UML 从目标系统的不同角度出发,定义了用例图.类图.对象图.状态图.活动图.时序图.协作图.构件图.部署图等 9 种图. 1.uml补充 统一建模语言(Unified ...
- IDEA 快捷键和字体设置
IDEA的使用 一.IDEA 目录 IDEA的使用 一.IDEA 设置字体 文本字体设置 窗口字体设置 二.IDEA建立项目 三.IDEA快捷键 设置字体 点击File->Settings 文本 ...
- Zookeeper(1)-安装与基础使用
Zookeeper 服务端 工作机制 Zookeeper从设计模式角度来理解:是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发 ...
- CPU是海王?聊聊 主/子线程 和 同/异步 的关系
最近表弟一直在找实习,经常会问我一些问题,有些问题在没有经历过真实工作时是真的不好理解的,所以我开了这个[表弟专栏],专门为找工作的表弟解决一些疑惑. 这篇文章从计算机发展的角度出发,描述为什么计算机 ...
- mysql 锁表
mysql 查看锁表解锁-- 查看那些表锁到了show OPEN TABLES where In_use > 0;-- 查看进程号show processlist;--删除进程 kill 108 ...