Tianshaojie's blog

Slow is fast.

ffi和jni的理解

  • 通过 ffi 调用 C 语言的API,可以实现全平台(除Web)的支持;
  • 通过 jni 调用 Java/Kotlin API,可以实现Android、Windows、macOS 和 Linux的支持(是的,不包括iOS平台,目前jni还是实验性质)
  • 通过 ffi 可以调用 iOS、MacOS 上 OC/Swift API 代码,可以替代通道调用;
  • 通过 jni 可以调用 Android SDK API 代码,可以替代通道调用;

ffi和jni的应用

  • 例如实现一个编解码库,仅依赖C语言API,通过FFI可以实现对Android、iOS、Macos、Widnows、Linux的支持,写一份C代码就行了
  • 如果调用iOS上的SDK,获取屏幕、电量等API,可以通过 ffi 实现(channel也可以实现)
  • 如果调用Android上的SDK,获取屏幕、电量等API,可以通过 jni 实现(channel也可以实现)

ffi和ffigen

jni和jnigen

  • package:jni 是支持库,提供的通用基础结构;
  • package:jnigen 是代码生成器,jnigen生成两个绑定,通过 JNI 调用 Java 方法的 C 绑定,以及通过 FFI 调用这些 C 包装器的 Dart 绑定。
阅读全文 »

Windows启用WSL2安装Ubuntu

Windows设置里开启虚拟化

开启开发者模式

  • 设置里,搜索开发者选项,打开即可

开启虚拟化

  • 按下 Win + R,调出命令输入窗口。输入指令 appwiz.cpl
  • 点击左侧的 【启动或关闭 Windows 功能】
  • 勾选【适用于 Linux 的 Windows 子系统】和【虚拟机平台】和【Hyper-V】

执行更新wsl命令已确认wsl为最新版

wsl --set-default-version 2
wsl --update
wsl --install // 安装wslg

应用商店安装Ubuntu

  • 启动 【Windows Store】并搜索 Ubuntu,然后选择要安装的系统;
  • 注意,需要先执行上面的 install 命令,要不然应用商店安装的Ubuntu都打不开;

启动Ubuntu

  1. 开始菜单找到Ubuntu程序点击打开(推荐)
  2. 在命令提示符中输入 wsl(看到的linux目录比较奇怪)
阅读全文 »

Flutter on Windows

Flutter on Windows 的一些关键描述

Flutter 跨平台的核心是:便携、 Skia 图形引擎、Flutter 渲染系统、动画、主题、文本输入和国际化以及 Flutter 提供的数百个控件。

但桌面应用不仅仅是在更大屏幕上运行的移动应用:

  • 它还有专用的输入设备,例如键盘和鼠标,并且有可调整大小的窗口,通常在宽屏显示器上运;
  • 对于辅助功能、输入法编辑器和视觉样式等关键事物有着不同的约定规则;
  • 与底层操作系统中的不同 API 集成:桌面应用支持从文件系统选择器到设备硬件,再到 Windows 注册表等数据存储的所有内容;
  • 因此,虽然我们在 Flutter 引入了 Windows 的支持,但我们也为 Windows 量身定制了 Flutter。

正如我们对 Android 和 iOS 的支持一样,Flutter 的 Windows 实现结合了 Dart 框架和 C++ 引擎,Windows 和 Flutter 通过一个嵌入层进行通信,该嵌入层承载 Flutter 引擎并负责翻译和分发 Windows 消息。

Flutter 与 Windows 协调以将开发者的 UI 绘制到屏幕上,处理窗口大小的调整和 DPI 更改等事件,并与现有的 Windows 模式配合使用以实现国际化,例如输入法编辑器。

阅读全文 »

概述

sed是stream editor的简称,是一款功能强大的流式文本编辑器。由于sed是以行为单位进行编辑文件 , 因此也称为行编辑器。

sed由标准输入读取编辑文件,读入一行或指定行放到模式空间”pattern space”,然后将所有编辑指令逐一对模式空间的内容进行编辑,之后将结果输出到标准输出,同时清除模式空间。接下来再将下一行资料读入模式空间,如此重复之前的操作,直到最后一行,流编辑器停止。

默认情况下所有的输出行都被打印到屏幕上,源文件内容并没有改变,除非你使用重定向存储输出。

sed 可以配合正则表达式使用,对文件内容进行替换、删除、新增、选取特定行等功能,用来自动编辑一个或多个文件,简化对文件的反复操作,编写转换程序等,功能十分强大。

系统差异

linux 环境默认是 GNU sed, macOS 默认使用的 BSD sed

macOS下sed总是会碰到一些奇怪的问题,或者查到命令执行无效,所以在macOS下最好安装gnu-sed,用gsed与linux下的sed是几乎一样的。

brew install gnu-sed

#然后设置到环境变量 .bash_profile 或 .zshrc 即可
PATH="/opt/homebrew/opt/gnu-sed/libexec/gnubin:$PATH"

语法

命令格式

sed [option] 'command' input_file
阅读全文 »

匹配符

.	匹配除回车以外的任意字符 a.c  abc abbbbc
() 字符串分组 (a|b) a或b
[] 定义字符类,匹配括号中的一个字符 [0-9] [a-z] 等
[^] 表示否定括号中出现字符类中的字符,取反。[^0-9] 是数字
\ 转义字符
阅读全文 »

ffigen 的作用


当你使用的C代码库内有大量API时,要花费大量时间编写 C 函数的 FFI 类型定义 及 对应的调用 C 函数 Dart Function,如下面两段代码。此时你可以使用 package:ffigen 绑定生成器,自动地从 C 头文件生成 FFI 包装,从而减少时间消耗。

为 C 函数的 FFI 类型签名的定义一个类型。

typedef hello_world_func = ffi.Void Function();

为调用 C 函数的变量定义一个类型。

typedef HelloWorld = void Function();
阅读全文 »

FFI plugin 插件库创建命令

flutter create --org com.cnht.flutter.hello --template=plugin_ffi --platforms=android,ios,macos,windows hello

使用–template=plugin_ffi可以创建一个ffi plugin,此处是通过命令行生产ffi接口,如果自定义接口,可以参考文末链接,制作ffi接口。

这种方式是dart依赖c源码方式提供插件库,不用预先编译动态链接库放到插件工程,通过CMake编译生成各个Native平台的动态链接库,源码都在src目录下管理。

ios和macos的Classes目录下hello.c,通过include引用src目录下的源码,源码放在一个目录方便维护。

阅读全文 »
0%