将Uint8List传递到dart:ffi中的Pointer <Void>

时间:2019-11-13 13:27:19

标签: dart

我有一个带有以下签名的C函数

bool sendFrame(int width, int height, int channelNumber, void *data, bool clone);

这里的数据是原始图像。

我的ffi函数签名是:

  final int Function(int, int, int, Pointer<Void>, int) rPPGSendFrame = rPPGLib
      .lookup<
          NativeFunction<
              Int32 Function(
                  Int32, Int32, Int32, Pointer<Void>, Int32)>>("sendFrame")
      .asFunction();

(由于不支持布尔类型,所以布尔必须转换为整数(对吗?)

我正在尝试使用来自相机流https://pub.dev/documentation/camera/latest/camera/Plane-class.htmlUint8List来从dart调用此方法,但是我不确定如何转换/分配我的Uint8Listvoid *

有什么主意吗?

干杯!

1 个答案:

答案 0 :(得分:0)

我不确定您是否仍然遇到此问题,但是最近我找到了一种将相机数据从图像流api传递到c ++的方法。

我的设置:

Flutter (Channel beta, v1.12.13+hotfix.6)
    • Flutter version 1.12.13+hotfix.6
    • Framework revision 18cd7a3601 (30 hours ago), 2019-12-11 06:35:39 -0800
    • Engine revision 2994f7e1e6
    • Dart version 2.7.0
ffi version 0.1.3 (https://pub.dev/packages/ffi)

在颤动代码中,准备以下图像数据:

import "dart:ffi" as ffi;

// 'data' is a Uint8List created by concatenating the planes received from the CameraImage the camera puts out.
// Based on the code found here https://github.com/renancaraujo/bitmap/blob/master/lib/ffi.dart in the execute function
// https://groups.google.com/forum/#!searchin/dart-ffi/list%7Csort:date/dart-ffi/V_6g5hpABec/U9we6UyvBAAJ
  final ffi.Pointer<ffi.Uint8> frameData = allocate<ffi.Uint8>(count: data.length); // Allocate a pointer large enough.
  final pointerList = frameData.asTypedList(data.length); // Create a list that uses our pointer and copy in the image data.
  pointerList.setAll(0, data);

这是使用the ffi example repository中的allocation.dart文件。

这是我在颤动中使用的绑定:

final int Function(ffi.Pointer<ffi.Uint8>, int, int, int) cppFunc = dynamicLibrary
    .lookup<ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<ffi.Uint8>, ffi.Int32, ffi.Int32, ffi.Int32)>>("cppFunc")
    .asFunction();

c ++函数如下所示:

extern "C" {
__attribute__((visibility("default"))) __attribute__((used))
    int cppFunc(unsigned char *data, int width, int height, int scanline) {
.
.
.

我不知道随着dart:ffi朝1.0前进,这种方法是否会继续有效,但我会尽力使此答案保持最新。