从C中的Dart_NativeArguments结构获取指向结构的指针

从C中的Dart_NativeArguments结构获取指向结构的指针,dart,dart-native-extension,Dart,Dart Native Extension,我正在尝试使用Dart包装一个C库。我从dart调用C函数,并通过C中的dart_NativeArguments结构传入参数: void _sayHello(Dart_NativeArguments arguments) { string from; Dart_Handle seed_object = HandleError(Dart_GetNativeArgument(arguments, 0)); if (Dart_IsString(seed_object))

我正在尝试使用Dart包装一个C库。我从dart调用C函数,并通过C中的dart_NativeArguments结构传入参数:

    void _sayHello(Dart_NativeArguments arguments) {
    string from;
    Dart_Handle seed_object = HandleError(Dart_GetNativeArgument(arguments, 0));
    if (Dart_IsString(seed_object)) {
        const char* seed;
        HandleError(Dart_StringToCString(seed_object, &seed));
        from = seed;
    }
    num = (int)Dart_GetNativeArgument(arguments, 1);

    Dart_SetReturnValue(arguments, HandleError(Dart_NewStringFromCString(sayHello(from, num).c_str())));
}
在Dart中,我调用函数并传入必要的参数

String sayHello(String from) native "sayHello";

main() {
  print(sayHello("Dart"));
}
我想知道我怎样才能传入指针(指向我创建的结构),而不仅仅是字符串和int作为参数。Dart中有一些函数可以将Dart_句柄转换为字符串和整数,但不能转换为指针。Dart_手柄的内部结构是什么?如何将其转换回指针?例如:

Dart代码:

String sayHello(info from) native "sayHello";


class info
{
  String message;
  int num;
}

main() {
  info tester = new info();
  tester.message = "Dart";
  tester.num = 2;
  print(sayHello(tester));
}
C代码:

void sayHello(Dart_NativeArguments arguments) {
    /*What do I do here to get back a pointe to the struct/class I passed
      in as an argument in Dart?*/
}

您的
Dart\u NativeArguments
将只包含一个项目,它将是一个实例-您使用
new info()
创建的类
info
的实例。您可以使用
bool Dart\u IsInstance(Dart\u Handle object)
测试它是否为实例。因此,您拥有的是一个info实例的句柄。这允许您使用
Dart\u GetField
Dart\u SetField
访问其实例字段(message和num)以获取和设置它们

Dart_Handle instance = Dart_GetNativeArgument(arguments, 0);
Dart_Handle message_handle = Dart_GetField(retobj, NewString("message"));
char* message;
Dart_StringToCString(message_handle, &message);
Dart_Handle number_handle = Dart_GetField(retobj, NewString("num"));
int64_t number;
Dart_IntegerToInt64(number_handle, &number);
// message contains the string, number contains the number
// use them, copy them etc
我知道这只是一个示例,但重新定义
sayHello
以获取两个参数(一个字符串和一个int)可能比传递对象实例更容易。没有一种方法可以一步访问类的字段,您需要单独访问它们。考虑一下这两个版本的DART代码,一个传递一个对象实例,一个传递值。第二个版本在Dart和C端更简单(无GetField步骤)。但是,第一个版本更强大,因为您可以使用SetField更新字段,而第二个版本则无法

class Info {
  String message;
  int num;

  Info(this.message, this.num);
}

version1() {
  sayHelloV1(new Info('Dart', 2));
}

version2() {
  sayHelloV2('Dart', 2);
}
如果您的C API要求您传入一个
struct
,您必须在C代码中创建该结构,方法是将使用
Dart\u integerPoint64
等提取的值复制到该结构中,然后将指向C结构的指针传递到API


如果您的API非常精确地将数据打包/填充到结构中,您可以使用Dart
typed\u data
将Dart类型打包到
ByteData
中,并传递底层字节数组。

您能解释一下“我创建的结构”是什么意思吗?也许发一些代码?本机界面中有一些函数可以将句柄转换为它们所表示的对象,这些函数可以是
List
s、
Map
s、
bool
eans和
TypedData
等。因为Dart中的所有对象都是
对象,它们也可以是函数,或者可以调用的方法。更新了我的问题并添加了一些代码来澄清我的意思。我试图用Dart封装一个C库。那么,我如何将指针和结构之类的参数从Dart传递到C来调用C函数呢?更新答案。如果答案不清楚,请在库中添加一个典型API调用的示例,这样我们就可以看到您试图调用的内容。