一个各平台调用 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 )的更多相关文章

  1. 【Linux】Mac好用虚拟机 Parallels Desktop、FinalShell-多终端连接工具(支持Windows,macOS,Linux)

    一.Mac好用虚拟机 Parallels Desktop 1.下载安装: 2.新建虚拟机: 3.配置管理: 二.FinalShell-多终端连接工具(支持Windows,macOS,Linux) 1. ...

  2. .NET MVC插件化开发(支持Script和css压缩)

    上一篇博文里面,没有支持Script和css的压缩功能以及script和css的路径问题也没有解决,所以重新发布一个版本,解决了这几个问题,并且优化了插件路由注册,现在可以很方便的实现热插拔web插件 ...

  3. Scrcpy用电脑控制Android手机(支持Windows/macOS/Linux)

    一.scrcpy简介 注意:拼写是scrcpy,非Python爬虫框架Scrapy. scrcpy可以通过adb调试的方式来将手机屏幕投到电脑上,并可以通过电脑控制您的Android设备.它可以通过U ...

  4. LiveBlox无需代码的开发工具--支持win macos ubuntu等开发环境--

    LiveBlox无需代码的开发工具-支持windows macos ubuntu. 强大 灵活 易于使用 视频简介:LiveBlox Develop Technology Without Coding ...

  5. 谷歌发布Flutter Alpha:支持Windows

    老孟导读:Windows来了,Mac.Linux.Web还远吗? 本文翻译自https://medium.com/flutter/announcing-flutter-windows-alpha-33 ...

  6. Flutter - flutter desktop embedding / flutter 桌面支持

    2019年5月9日,随着谷歌在IO19宣布Flutter支持Web平台,就标志着Flutter已经全面支持所有平台(移动.网页.桌面.嵌入式). 现编一个跨平台小段子: 微软Xarmarin:喵喵喵? ...

  7. nopCommerce 3.9 大波浪系列 之 开发支持多店的插件

    一.基础介绍 nop支持多店及多语言,本篇结合NivoSlider插件介绍下如何开发支持多商城的小部件. 主要接口如下: ISettingService 接口:设置接口,可实现多店配置. (点击接口介 ...

  8. Flutter学习(一)——搭建开发环境(Windows)

    久闻 Flutter 大名,今天终于有时间体验一下了 ٩(๑>◡<๑)۶ 官网:https://flutter.dev/ 中文官网:https://flutterchina.club/ 一 ...

  9. 大熊君JavaScript插件化开发------(第一季)

    一,开篇分析 Hi,大家!大熊君又来了,今天这系列文章主要是说说如何开发基于“JavaScript”的插件式开发,我想很多人对”插件“这个词并不陌生, 有的人可能叫“组件”或“部件”,这不重要,关键是 ...

随机推荐

  1. Write Combining Buffer

    现代CPU使用了很多技术来降低对内存存取数据的延时,因为CPU执行的速度实在是太快了,在从内存存取数据的约120ns中,可以执行数百条指令. 其中多级的缓存架构就是为了减少这种延时,来提高CPU的利用 ...

  2. JDK下载安装与环境变量配置【全网最新】

    1.下载安装JDK 下载地址:(https://www.oracle.com/java/technologies/downloads/) 最好选择解压版,解压即可(说删就删) 解压:例如我解压目录为 ...

  3. ASP.NET Core 6框架揭秘实例演示[17]:利用IHttpClientFactory工厂来创建HttpClient

    在一个采用依赖注入框架的应用中,我们一般不太推荐利用手工创建的HttpClient对象来进行HTTP调用,使用的HttpClient对象最好利用注入的IHttpClientFactory工厂来创建.前 ...

  4. GoLang设计模式21 - 装饰模式

    装饰器模式是一种结构型设计模式.通过装饰器模式可以为一个对象添加额外的功能而不需对其作出调整. 还是通过具体的案例来了解装饰器模式:假设我们开了一家披萨店,现在店里主营两款披萨: 素食狂披萨(Vegg ...

  5. CF587F&CF547E题解

    这两道题好像啊 贡献一种使用SAM和ACAM草两道题的方法 下面假装有 \(O(\sum |S|=m)=O(n)\). 你看看,这CF换过多少个出题人啦?换汤不换药啦!其实这两道题是同一个人出的 CF ...

  6. LOJ6485题解

    应该是经典题之一了. \[[n|k]=\frac 1 n\sum_{i=0}^{n-1}w_n^{ik} \] 有这个就可以算了. \[\sum_{i=0}^n\binom n i x^ia_{i \ ...

  7. LGP5795题解

    首先 \(k\) 大容易让我们想到 主席树&树套树&整体二分,而异或又让我们想到 01-Trie. 所以就有一个很明显的二分,二分一个 mid 看有多少个数不大于 mid. 然后发现 ...

  8. 大数据教程-01HDFS的基本组成和原理

    一 Hadoop历史背景 起源于2003年谷歌的Google File System相关论文,随后Doug Cutting(我们下面就叫他切哥吧)基于GFS的论文实现了分布式文件系统,并把它命名为ND ...

  9. Block对变量的引用

    如果在 Block 内部使用外部的变量,Block 会持有这个变量.下面来看几中特殊的情况,看 Block 对变量的持有情况如何. typeof @interface X : NSObject @pr ...

  10. C++ struct结构体内存对齐

    •小试牛刀 我们自定义两个结构体 A 和 B: struct A { char c1; char c2; int i; double d; }; struct B { char c1; int i; ...