Flutter 直接调用so动态库,或调用C/C++源文件内函数

【Flutter跨平台插件开发】如何实现kotlin跟C++的相互调用 在 JNI (Java Native Interface) 中,“(Ljava/lang/String;在 Kotlin 中,可以使用 JNI (Java Native Interface) 来设置回调到 C++ 代码。在 JNI 中,“V” 表示 void,也就是说这个方法没有返回值。,你需要创建一个全局引用,这样它就可以跨越多个 JNI 调用。如果你在一个已经被附加到 JVM 的线程中调用回调,你不需要调用这两个方法。函数在 C++ 代码中被调用,然后它调用 Kotlin 中的。,并使用了全局引用。 阅读详情

开发环境

MacBook Pro Apple M2 Pro | macOS Sonoma 14.0
Android Studio Giraffe | 2022.3.1 Patch 1
XCode Version 15.0
Flutter 3.13.2 • channel stable
Tools • Dart 3.1.0 • DevTools 2.25.0


先说下历程,因为我已经使用了Flutter3+的版本,起初了解到Flutter调用C/C++可以使用dart原生的 ‘dart:ffi’ 库,于是按照找到的一些文档使用,结果无论如何都会报错:“Failed to load dynamic library”,也就是在 DynamicLibrary.open('libxxx.so') 的阶段就失败了,我把 .so 文件尝试放过好几个目录 /assets/libs/、 /lib/、 /android/app/src/main/jniLibs/,最终都会报这个错误,现在才知道库文件需要放在你根本想象不到的地方!!!

尝试了一些方法还是不行后我放弃了 ffi,想着用 Flutter 的 MethodChannel 桥接 android/ios 原生,再让原生去调 native 层。一顿操作把Android端的搞定了,当然中间涉及到 Kotlin和C++ 层的数据类型映射的痛苦,而且业务函数也不像一个 helloworld 那么简单,别提有多痛苦了。当我再转身去搞iOS端的时候看到了iOS应该使用静态库 .a/.framework 格式的消息,如果使用动态库上架App Store是会被驳回的!native端不是我写的,我只有动态库,虽然之前写过双端的密钥插件有点经验,但是iOS毕竟咱过于陌生需要遍地找文档,过程实在过于痛苦,于是非常不甘心地又尝试起了 ffi 的方案。

在反复尝试了各种文档和博客后,我新建了一个Flutter C++的插件项目终于跑通了,并且找到了生成的库文件存放的位置。其实用法很简单,只是走错了路让我痛苦了一遍又一遍!!!
Flutter 和 Dart 的 官方文档 都只讲了如何调用 C/C++函数,没有提到如何直接调用 动态库或静态库。

中间我尝试了用Android原生 jni 调so库、用xcode写C++代码生成静态库给iOS调用、cmake交叉编译各平台库…因为 jni 的方式需要 包名、类名、入参类型、返回值类型 完全对应才能正确映射,jni 几百年不用一次又去捡了一遍这些细节知识,我真的椒麻了!!!

下面分别示例了 Flutter直接调用so动态库 和 Flutter调用C/C++源文件内函数,第一种方式更为简单,因为省去了编译相关的配置


Flutter直接调用so动态库

先讲一下流程:

  1. 在正确的地方放置 .so 文件
  2. 编写 dart 代码调用 native 函数
  3. 在 dart 代码中调用 dart 映射的函数

案例:

我创建了一个 C++ 项目,使用一个 .cpp 文件写了一个 add 函数,add 函数有 两个 int 类型的入参,和一个 int 类型的出参,最终打包了 libnative_add.so 文件给 Flutter项目的 Android和iOS两端使用。

cpp 代码如下:

#include <stdio.h>

// extern "C" 是移动端调用 C++ 代码需要的,调用 C 代码则不需要
extern "C" {
   
   
    int32_t add(int32_t a, int32_t b) {
   
   
        return a + b;
    }
}

映射成 dart 代码也就是:


int add(int a, int b) {
   
   
  return a + b;
}

一、.so文件放在哪个目录

这可以说是坑了我的最关键的一步,动态库应该放的目录是:

项目名/build/app/intermediates/merged_native_libs/debug/out/lib/,因为我是新建的插件项目,所以我的目录层级会多一级。

.so文件目录

对应的架构和原生一样分别放在自己的目录,比如 armeabi-v7a、arm64-v8a、x86_64,这里面也涉及真机和模拟器的一些问题

build 目录可能在 Android Studio 内看不到,到文件夹下去操作就行,release 阶段也需要在对应目录放置库文件。是不是非常意想不到,毕竟这个目录一旦 clean 就没了,不过可以放在其他目录写个 gradle 脚本拷贝过去

顺便提一下 Flutter 很

Flutter鸿蒙化实战:ASN.1编解码库的C++桥接与ArkTS封装 ASN.1(抽象语法标记一)是定义数据结构的国际标准,广泛应用于X.509数字证书、PKCS#7/PKCS#12加密格式以及TLS/SSL等安全协议中,是网络安全和数据交换的基石。其核心原理是通过一套严谨的编码规则(如DER)将复杂数据结构序列化为字节流,确保跨平台和跨语言的数据一致性。在工程实践中,ASN.1编解码器的实现直接关系到应用的安全通信能力,尤其在处理证书解析、密钥交换等场景时不可或缺。随着鸿蒙HarmonyOS Next的普及,其ArkTS/ArkUI开发范式与Flutter的Dart环境存在 阅读详情

相关推荐

flutter调用c/c++方法并在项目中使用(记录)

flutter调用c/c++方法并在项目中使用(记录) 参考 官方文档 做人要简单的帖子 1、在vscode中使用指令新建一个plugin项目:flutter create -t plugin native_add 2、在新建的native_add项目中,新建native_add.cpp文件,并放到ios/Classes/,如下图 3、native_add.cpp添加两个方法 #include extern C { // __attribute__((visibility(default))) __attribute__((used)) int32_t native_add(int

Rasa Core开发指南

文章目录1. Rasa Core简介1.1 Rasa Core消息处理流程1.2 安装Rasa Core2. Dialogue模型训练2.1 Story样本数据2.2 Domain2.2.0 intents2.2.1 actions2.2.2 templates2.2.3 entities2.2.4 slots3 .训练和使用对话模型3.1 训练对话模型3.2 使用对话模型4. 搭建CustomA...

老蒋也疯狂 1万+

将赛灵思 SDK 工程移植到 Vitis 的分步指南

注:本文转自赛灵思中文社区论坛,源文链接在此。本文原作者为XILINX工程师。 以下为个人译文,仅供参考,如有疏漏之处,还请不吝赐教。 您是赛灵思软件开发套件 (SDK) 用户吗? 您是否正在计划将自己的工程移植到 Vitis 软件平台? 那么本篇工程移植分步指南将能祝您一臂之力。 从 2019.2 版开始,赛灵思 SDK 开发环境已统一整合到全功能一体化的 Vitis™ 统一软件平台中。 尊敬的 SDK 用户,您只需轻点几下鼠标即可体验这一功能丰富的工具! 马上开始将工程从赛灵思 S

weixin_45825101的博客 1724

MQTT(一)C#使用 MQTTnet 快速实现 MQTT 通信(文末有完整Demo下载)

目录 MQTT(一)C#使用 MQTTnet 快速实现 MQTT 通信(文末有完整Demo下载) MQTT(二)在windows64位上安装Python环境 MQTT(三)Python客户端+net客户端+net服务端 简单通信 MQTT(四)树莓派开机自动运行Python客户端 MQTT(五)EMQ开源MQTT消息服务器 1 什么是 MQTT ? MQTT(Message Que...

pw的博客 10万+

OBS技术深度剖析:从开源直播工具到专业制作引擎的进化之路

本文深入剖析了开源直播软件OBS的技术架构与发展历程。从2012年诞生至今,OBS已成长为直播领域的事实标准,其成功源于模块化设计和开源协作模式。文章详细解析了OBS的核心技术:1) 分层架构与插件系统,2) GPU加速的渲染管线,3) 智能音频处理,4) 多平台编码优化。同时探讨了虚拟摄像头、浏览器源等高级功能的实现原理,并提供了性能优化方案和硬件配置建议。随着AI、WebRTC等新技术发展,OBS将持续引领实时内容创作工具的创新,为开发者和创作者提供更强大的技术支持。

程序猿老樊的博客 309

卡诺图化简法注意事项+竞争冒险知识点总结

今天反思以下卡诺图化简法中的注意事项。 卡诺图看起来简单,但如果不熟悉的话很容易出错,因此要对画圈的规则比较熟悉。

weixin_42415266的博客 1万+

【深度学习|Transformer模型学习】什么是前馈神经网络(Feed-Forward Neural Network)?将前馈神经网络中的全连接层变成1*1卷积层会有什么样的效果?

【深度学习|Transformer模型学习】什么是前馈神经网络(Feed-Forward Neural Network)?将前馈神经网络中的全连接层变成1*1卷积层会有什么样的效果?

985小水博的摸鱼日常 1364

泛微OA集成阿里云短信(E9保姆教程)

泛微OA集成阿里云短信(E9保姆教程)

技术分享 509

【RTD】二分法查找和分段线性插值算法在RTD中应用

二分法查找和分段线性插值算法在RTD中的典型应用。

只要思想不滑坡,想法总比问题多。 2356

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

上一篇: Dart-C、Dart-Kotlin/Java/Swift/Object-C、Kotlin-C数据类型对照表
下一篇: Flutter 应用启动从闪屏页短暂黑屏再到第一个页面
柯基爱蹦跶
博客等级 码龄9年 65粉丝 97原创
评论 12
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柯基爱蹦跶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值