c - Dart C 互操作性。将整数数组传递给 C 函数

标签 c dart interop ffi dart-ffi

我现在正在学习 Dart,并且在玩 Dart 与 C 的互操作性。我能够使用带有两个 int 参数的 C 方法。代码如下:

hello.dart

import 'dart:ffi' as ffi;

typedef sum_func = ffi.Int32 Function(ffi.Int32 a, ffi.Int32 b);
typedef Sum = int Function(int a, int b);
...
final dylib = ffi.DynamicLibrary.open(path);
final sumPointer = dylib.lookup<ffi.NativeFunction<sum_func>>('sum');

final sum = sumPointer.asFunction<Sum>();
print('3 + 5 = ${sum(3, 5)}');

hello.c
int sum(int a, int b){
    return a + b;
}

你好.h
int add(int x, int y)

hello.def
LIBRARY   hello
EXPORTS
   sum

这一切都很好,但我也想要一个 max C 方法,它接受一个 int 数组作为输入并返回最大的数字。我怎样才能做到这一点?我已经在 C 中实现了所有必需的代码,但我不确定如何将它与 Dart 进行“链接”。有人可以帮我吗?

最佳答案

首先,我真的想说我不是 C 程序员,尤其是当涉及到指针时,我什至没有假装我完全了解如何以最佳方式做这类事情。
有了这个,这里是我基于此处找到的原语示例的解决方案:https://github.com/dart-lang/samples/tree/master/ffi/primitives
图元.dart

import 'dart:ffi';
import 'dart:io' show Platform;

import 'package:ffi/ffi.dart';

typedef max_func = Int32 Function(Pointer<Int32> list, Int32 size);
typedef Max = int Function(Pointer<Int32> list, int size);

void main() {
  var path = './primitives_library/libprimitives.so';
  if (Platform.isMacOS) path = './primitives_library/libprimtives.dylib';
  if (Platform.isWindows) path = r'primitives_library\Debug\primitives.dll';
  final dylib = DynamicLibrary.open(path);

  final list = [1, 5, 3, 59030, 131000, 0];
  final listPtr = intListToArray(list);

  final maxPointer = dylib.lookup<NativeFunction<max_func>>('max');
  final max = maxPointer.asFunction<Max>();
  print('${max(listPtr, list.length)}'); // 131000
  malloc.free(listPtr);
}

Pointer<Int32> intListToArray(List<int> list) {
  final ptr = malloc.allocate<Int32>(sizeOf<Int32>() * list.length);
  for (var i = 0; i < list.length; i++) {
    ptr.elementAt(i).value = list[i];
  }
  return ptr;
}
图元.h
int max(int *listPtr, int size);
图元.c
#include "primitives.h"

int max(int *listPtr, int size)
{
  int currentMax = *listPtr;

  for (int i = 0; i < size; i++)
  {
    if (currentMax < *listPtr)
    {
      currentMax = *listPtr;
    }
    listPtr++;
  }

  return currentMax;
}

关于c - Dart C 互操作性。将整数数组传递给 C 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60888021/

相关文章:

flutter - 如何在 Flutter 中更改状态栏和应用栏颜色?

Flutter GestureDetector(如果向下滑动以关闭)

python - 通过已注册的 TLB 从 python 访问未注册的 COM 对象

dart - Tabbarview 和 Pageview 无法在页面之间滑动

c# - .NET 互操作中是否有内存安全级别?

c# - 从 C# 使用 C 库的技巧

c - 为什么我不能 fscanf() 两个不同的文件并在一段时间内同时获取输入?

c - 交换单向链表中的节点

c - 混合 c 和组装。在终端上没有打印任何内容

c - BITWISE 运算符用法