ffi简介
FFI(Foreign Function Interface)是用来与其它语言交互的接口,在有些语言里面称为语言绑定(language bindings),Java 里面一般称为 JNI(Java Native Interface) 或 JNA(Java Native Access)。由于现实中很多程序是由不同编程语言写的,必然会涉及到跨语言调用,比如 A 语言写的函数如果想在 B 语言里面调用,这时一般有两种解决方案:一种是将函数做成一个服务,通过进程间通信(IPC)或网络协议通信(RPC, RESTFul等);另一种就是直接通过 FFI 调用。前者需要至少两个独立的进程才能实现,而后者直接将其它语言的接口内嵌到本语言中,所以调用效率比前者高。

rust代码

  1. 创建一个文件夹,如flutter-ffi-rust,然后进入flutter-ffi-rust文件夹执行:cargo new rust_ffi
  2. 进入rust_ffi执行:cargo run,确保创建的rust项目可以执行
  3. 在Cargo.toml文件中添加代码如下:
[lib]
name = "casher"
crate-type = ["cdylib"]
  1. 将mian.rs改为lib.rs,将如下代码粘贴进去:
use std::io::Write;
use std::ffi::CStr;
use std::os::raw::c_char;#[no_mangle]
pub extern "C" fn play_once(ptr: *const c_char) -> u32 {let cstr = unsafe { CStr::from_ptr(ptr)};let a = cstr.to_str().unwrap();let mut file = std::fs::File::create("data.txt").expect("create failed");file.write_all("简单测试121212".as_bytes()).expect("write failed");file.write_all("\n简单编程".as_bytes()).expect("write failed");println!("data written to file" );println!("data written to file----{}",a);let return_num = 10;return_num
}#[no_mangle]
pub extern "C" fn play_once_test(ptr: *const c_char) -> u32 {let cstr = unsafe { CStr::from_ptr(ptr)};let a = cstr.to_str().unwrap();println!("data written to file-----------{}",a);let mut file = std::fs::File::create("datatest.txt").expect("create failed");file.write_all("简单教程测试".as_bytes()).expect("write failed");file.write_all("\n简单编程测试".as_bytes()).expect("write failed");println!("data written to file" );let s = 11;s
}
  1. 执行cargo build,然后target/debug下面会出现一个ibcasher.dylib文件,注意:在Linux上会创建*.so文件,在MacOSX上会创建*.dylib文件,在Windows上会创建*.dll文件,我是macos,所以会生成dylib文件

dart代码

  1. 在flutter-ffi-rust文件夹下创建flutter项目,执行dart create flutter_ffi
  2. 进入flutter_ffi里面执行dart run,确保创建的flutter项目正确,然后执行 dart pub add ffi 或者在pubspec.yaml 安装 ffi: ^1.2.1
  3. 将如下代码粘入bin/flutter_ffi.dart里面:
import 'dart:ffi' as ffi;
import 'package:ffi/ffi.dart';typedef playOnceFunc = ffi.Void Function(ffi.Pointer<Utf8>);
typedef PlayOnce = void Function(ffi.Pointer<Utf8>);void main() {final ffi.DynamicLibrary dylib = ffi.DynamicLibrary.open('libcasher.dylib');// final PlayOnce play_once = dylib//     .lookup<ffi.NativeFunction<playOnceFunc>>('play_once')//     .asFunction();// final PlayOnce play_once_test = dylib//     .lookup<ffi.NativeFunction<playOnceFunc>>('play_once_test')//     .asFunction();const String file_name = '用来测试传递参数';// Convert a Dart [String] to a Utf8-encoded null-terminated C string.final ffi.Pointer<Utf8> charPointer = file_name.toNativeUtf8();var result = dylib.lookupFunction<ffi.Pointer<Utf8> Function(ffi.Pointer<Utf8>),ffi.Pointer<Utf8> Function(ffi.Pointer<Utf8>)>('play_once_test',isLeaf:true);// play_once(charPointer);var s = result(charPointer).address;print("==============");print(s);// play_once_test();
}
  1. 将生成的*.dylib文件放入flutter_ffi文件夹下
  2. 执行dart run,看调用rust的结果,会生成data.txt文件并写入数据

flutter/dart通过ffi调用rust代码相关推荐

  1. PyO3: python调用rust代码尝试

    PyO3功能很强大,是python和rust之间交互桥梁.今天主要试验一下python端调用rust端编译的代码库. 说明:本文环境中在windos平台和WSL下 unbuntu18.04平台.lin ...

  2. 在Flutter项目使用FFI调用Golang项目全记录

    文章目录 前言 0x01 go代码编写 0x02 编译go代码 0x03 导入so文件 0x03 FFI绑定 前言 目前有一个项目涉及到html的解析, js执行等. 由于dart的库并不是很完善, ...

  3. 使用PyO3从Python调用 Rust:加速Python

    使用 Rust 加速你的 Python: PyO3使从 Python 调用 Rust 代码变得容易.您可以编写 Rust 库,并依靠 PyO3 和生态系统中maturin的支持工具的组合PyO3来编译 ...

  4. 【Rust 日报】2021-11-26 使用 PyO3 从 Python 调用 Rust

    使用 PyO3 从 Python 调用 Rust PyO3 让 Python 调用 Rust 代码变得容易.用户可以编写 Rust 库,并依靠 PyO3 和生态系统中maturin的支持工具的组合 P ...

  5. python调用rust_在 Rust 代码中编写 Python 是种怎样的体验?

    本文为转载摘要,完整版请移步: https://mp.weixin.qq.com/s/YT_HNFDCQ_IyocvBkRNJnA 以下为译文: 大约一年前,我发布了一个名为inline-python ...

  6. 用Flutter + Dart快速构建一款绝美移动App

    作者 | Wojciech Kuroczycki 译者 | 弯月 来源 | CSDN(ID:CSDNnews) 如今,与前端或移动相关的新框架层出不穷.所有从事Web开发的人都应该熟悉各种目不暇接的新 ...

  7. 不用掉一根头发!用 Flutter + Dart 快速构建一款绝美移动 App

    作者 | Wojciech Kuroczycki 译者 | 弯月 出品 | CSDN(ID:CSDNnews) 如今这个时代,与前端或移动相关的新框架层出不穷.所有从事Web开发的人都应该熟悉各种目不 ...

  8. Flutter --- Dart简介

    一.简介 由Google主导开发,于2011年10月公开.它的开发团队由Google Chrome浏览器V8引擎团队的领导者拉尔斯·巴克主持,目标在于成为下一代结构化Web开发语言.类似JavaScr ...

  9. rust如何在木板上上传图片_C调用Rust动态链接库实现Http文件上传

    絮絮叨叨 笔者最近做一个项目,跟一个写C的小伙一起开发.笔者原本是用Java写服务端接口的,那个小伙用C写客户端.客户端某个功能需要图片到服务端的Http接口上. 而写C的小伙目前对Http这块还不熟 ...

最新文章

  1. 交叉验证分析每一折(fold of Kfold)验证数据的评估指标并绘制综合ROC曲线
  2. luogu cover
  3. node使用npm一句命令停止某个端口号 xl_close_port
  4. Lua学习笔记之数字
  5. cdn刷新api_闲话 CDN
  6. vue使用python_如何使用Python和Vue创建两人游戏
  7. 2015蓝桥杯b组java_Java实现第十一届蓝桥杯JavaB组 省赛真题
  8. 计算机视觉论文-2021-06-14
  9. scala的stream流
  10. React中diff算法的理解
  11. Japan树状数组求逆序数
  12. 【NOIP2017Day1T3】【洛谷P3953】逛公园
  13. nginx 反向代理及负载均衡
  14. Java_接口练习题
  15. php获取 微信unionid,微信授权登录获取openId和unionId
  16. linux系统的nginx使用及本地访问
  17. 免费asp.net空间
  18. 迅捷在线PDF转换成Word转换器简介
  19. 32位int 最小负整数
  20. HL7解析类的使用(java)

热门文章

  1. 爬虫第四战爬取糗事百科搞笑段子
  2. 基于Python的毕业论文怎么写?
  3. 验证码之google的reCAPTCHA使用
  4. Python | List和Deque的速度对比
  5. 钽电容的作用,钽电容滤波好的原因
  6. linux设置环境变量设置环境变量
  7. 矩阵的Jordan分解实例
  8. JAVA实现篮球计分计时器
  9. 中国发布域名系统基础软件 “红枫”
  10. USB VID 查询