Android 上使用 dart:ffi 调用本地代码

您所在的位置:网站首页 c程序打包apk Android 上使用 dart:ffi 调用本地代码

Android 上使用 dart:ffi 调用本地代码

2023-05-29 21:56| 来源: 网络整理| 查看: 265

Android 上使用 dart:ffi 调用本地代码 Contents

动态链接 vs 静态链接

步骤 1:创建插件

步骤 2:添加 C/C++ 源码

步骤 3:在 FFI 库中读取代码

其他的用例

平台库

第一方库

开源三方库

闭源三方库

Android APK 尺寸(共享对象压缩)

Flutter 移动版可以使用 dart:ffi 库来调用本地的 C API。 FFI 代表 外部功能接口。类似功能的其他术语包括本地接口和语言绑定。

提示

本文描述的是在 Android 应用中使用 dart:ffi 库。你可以阅读 在 iOS 中使用 dart:ffi 调用本地代码 或 在 macOS 中使用 dart:ffi 调用本地代码。 Web 插件暂不支持调用本地代码。

你必须首先确保本地代码已加载,并且其符号对 Dart 可见,然后才能在库或程序使用 FFI 库绑定本地代码。本页主要介绍如何在 Flutter 插件或应用程序中编译、打包和加载本地代码。

本教程演示了如何在 Flutter 插件中捆绑 C/C++ 源代码,并使用 Android 和 iOS 上的 Dart FFI 库绑定它们。在本示例中,你将创建一个实现 32 位的加法 C 函数,然后通过名为 “native_add” 的 Dart 插件暴露它。

动态链接 vs 静态链接

本地库可以动态或静态地链接到应用程序中。一个静态链接库会被嵌入到应用程序的可执行映像中,并在应用程序启动时加载。

静态链接中的符号可以使用 DynamicLibrary.executable 或 DynamicLibrary.process 来加载。

相比之下,动态链接库则分布在应用程序中的单独的文件或文件夹中,并按需加载。在 Android 上,动态链接库作为一组 .so(ELF 可执行与可链接格式)文件分发,每个架构各有一个。

动态链接库在 Dart 中可以通过 DynamicLibrary.open 加载。

Dart dev 频道中的 API 已经可用: Dart API 参考文档.

步骤 1:创建插件

如果你已经有一个插件,跳过这步。

如果要创建一个名为 “native_add” 的插件,你需要这么做:

$ flutter create --platforms=android,ios --template=plugin native_add $ cd native_add

提示

你可以使用 –platforms 来排除你不需要的平台。但是,你仍需要包含测试设备所需的平台。

步骤 2:添加 C/C++ 源码

你需要让 Android 和 iOS 构建系统知道本地代码的存在,以便代码可以被编译并链接到最终的应用程序中。

你可以将特定于 Android 的源代码添加到 android 文件夹并修改 CMakeLists.txt 文件。同时,你可以在 Gradle 中指向 ios 文件夹,这样的话就可以为 iOS 和 Android 设定不同的资源。

FFI 库只能与 C 符号绑定,因此在 C++ 中,这些符号添加 extern C 标记。还应该添加属性来表明符号是需要被 Dart 引用的,以防止链接器在优化链接时会丢弃符号。

在 Android 中,你需要创建一个 CMakeLists.txt 文件用来定义如何编译源文件,同时告诉 Gradle 如何去定位它们。在项目根目录下,运行如下代码:

cat > android/CMakeLists.txt


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3