从 C 中的 Dart_NativeArguments 结构获取指向结构的指针
Get pointer to a struct from a Dart_NativeArguments struct in C
我正在尝试使用 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"));
}
我想知道如何传递指针(指向我创建的结构)而不只是字符串和整数作为参数。 Dart 中有一些函数可以将 Dart_Handles 转换为字符串和整数,但不能转换为指针。 Dart_Handle 的内部结构是什么?我该如何将它转换回指针?例如:
飞镖代码:
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_NativeArguments
将仅包含一个项目,它将是一个 实例 - 您的 class info
的实例使用 new info()
创建。你可以用bool Dart_IsInstance(Dart_Handle object)
测试它是否是一个实例。所以你拥有的是信息实例的句柄。这允许您使用 Dart_GetField
和 Dart_SetField
.
访问其 实例字段 (消息和数字)以获取和设置它们
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
以采用 2 个参数(一个字符串和一个 int)而不是传递一个对象实例可能更容易。无法一步访问 class 的字段,您需要单独访问它们。考虑这两种版本的 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_IntegerToInt64
等提取的值复制到其中,然后将指向 C 结构的指针传递给 API.
如果你的 API 非常 精确地将数据 packing/padding 放入结构中,你可以使用 Dart typed_data
来打包Dart 类型为 ByteData
并传递底层字节数组。
我正在尝试使用 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"));
}
我想知道如何传递指针(指向我创建的结构)而不只是字符串和整数作为参数。 Dart 中有一些函数可以将 Dart_Handles 转换为字符串和整数,但不能转换为指针。 Dart_Handle 的内部结构是什么?我该如何将它转换回指针?例如:
飞镖代码:
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_NativeArguments
将仅包含一个项目,它将是一个 实例 - 您的 class info
的实例使用 new info()
创建。你可以用bool Dart_IsInstance(Dart_Handle object)
测试它是否是一个实例。所以你拥有的是信息实例的句柄。这允许您使用 Dart_GetField
和 Dart_SetField
.
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
以采用 2 个参数(一个字符串和一个 int)而不是传递一个对象实例可能更容易。无法一步访问 class 的字段,您需要单独访问它们。考虑这两种版本的 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_IntegerToInt64
等提取的值复制到其中,然后将指向 C 结构的指针传递给 API.
如果你的 API 非常 精确地将数据 packing/padding 放入结构中,你可以使用 Dart typed_data
来打包Dart 类型为 ByteData
并传递底层字节数组。