美文网首页
2023-04-26 在 iOS 中使用 dart:ffi 调用

2023-04-26 在 iOS 中使用 dart:ffi 调用

作者: 我是小胡胡123 | 来源:发表于2023-04-25 18:06 被阅读0次

官方文档:在 iOS 中使用 dart:ffi 调用本地代码

dart 调用ios 代码

ios代码通常包括:
c++/c/objc/swift

dart通过dart:ffi直接调用IOS侧的实现。

在IOS侧:

实现c方法:
可以放在cpp 中,也可以放在m文件中,还可以是swift文件

//__attribute__((visibility("default"))) __attribute__((used))
extern "C" __attribute__((visibility("default"))) __attribute__((used))
int32_t native_add_objc(int32_t x, int32_t y) {
    return x + y;
}

只有当在cpp文件中用extern "C"
关于extern "C"的用法 参考文章: c和c++语言的混合编程
如果是swift使用下面前缀导出,以确保它们对 Dart 可见:

@_cdecl("myFunctionName")

在dart侧实现dart 方法和 ios native方法的完成DynamicLibrary绑定:
创建一个native_add.dart文件:

import 'dart:ffi'; // For FFI
import 'dart:io'; // For Platform.isX

final DynamicLibrary nativeAddLib = Platform.isAndroid
    ? DynamicLibrary.open('libnative_add.so')
    // : DynamicLibrary.process();
    : DynamicLibrary.executable();
final int Function(int x, int y) nativeAdd = nativeAddLib
    .lookup<NativeFunction<Int32 Function(Int32, Int32)>>('native_add')
    .asFunction();
final int Function(int x, int y) nativeAddObjc = nativeAddLib
    .lookup<NativeFunction<Int32 Function(Int32, Int32)>>('native_add_objc')
    .asFunction();

dart上调用:
nativeAdd(1, 2)
nativeAddObjc(1, 2)

Center(
  child: TextButton(
    child: Text('nativeAdd: ${result}\n'),
    onPressed: () {
      result = '${nativeAdd(1, 2)}';
      setState(() {});
    },
  ),
),
Center(
  child: TextButton(
    child: Text('nativeAddObjc: ${result}\n'),
    onPressed: () {
      result = '${nativeAddObjc(1, 2)}';
      setState(() {});
    },
  ),
),

这样就完成了dart通过使用dart:ffi对 IOS native 方法(c/c++/objc/swift)的调用。

总结一下dart:ffi实现原理;

dart:ffi 是 Dart 语言提供的一种 FFI(Foreign Function Interface)的实现方式,用于在 Dart 代码中直接调用 C 代码中的函数。dart:ffi 实现的核心原理是使用 Dart VM 中的动态链接库(dynamic library)机制,将 Dart 代码和 C 代码进行链接。

在 Dart 代码中使用 dart:ffi 调用 C 函数的基本步骤如下:

  1. 定义 C 函数的接口
    在 Dart 中定义 C 函数的接口,包括函数名、参数类型和返回类型。这些定义会被编译为 C 语言的函数声明。

  2. 加载动态链接库
    在 Dart 代码中使用 DynamicLibrary 类加载 C 语言编译后的动态链接库。

  3. 获得 C 函数指针
    在 Dart 代码中使用 Pointer<NativeFunction> 类获得 C 函数的指针。

  4. 调用 C 函数
    在 Dart 代码中使用 NativeFunction 类的 asFunction 方法将 C 函数指针转换为 Dart 函数,然后可以直接调用该函数。

dart:ffi中最关键的类是 DynamicLibrary、Pointer 和 NativeFunction。DynamicLibrary 用于加载动态链接库,Pointer 用于操作指针,NativeFunction 用于将 C 函数指针转换为 Dart 函数。

总之,dart:ffi 实现的核心是将 Dart 代码和 C 代码进行链接,通过指针操作在 Dart 代码中调用 C 函数,从而实现了 FFI 的功能。

相关文章

网友评论

      本文标题:2023-04-26 在 iOS 中使用 dart:ffi 调用

      本文链接:https://www.haomeiwen.com/subject/gakmjdtx.html