我有一个基本的FFI调用,它从Dart中检索C结构体。只有结构体的char *
和int *
字段返回正确的值。float *
和int
返回错误的值。C和Dart代码及其输出如下所示。如果我在C端打印出这两个错误类型,它们确实会生成正确的值。
C代码
// C code
typedef struct {
float * floatPtr;
int count;
char * name;
int * intPtr;
}baseStruct;
baseStruct getMyStruct(){
static baseStruct myStruct;
static int someint = 22;
static float foo [] = {0.1, 0.2, 0.3};
myStruct.floatPtr = foo;
myStruct.count = 0;
myStruct.intPtr = &someint;
myStruct.name = "some string";
return myStruct;
}
** dart 代码**
// Dart Type for C struct
class MyStructType extends Struct {
external Pointer<Float> floatPtr;
@Int32()
external int count;
external Pointer<Int> intPtr; //worked
external Pointer<Utf8> name; //worked
}
// type defs for FFI
typedef GetMyStructNative = MyStructType Function();
typedef GetMyStruct = MyStructType Function();
// Code to call function from dynamic library
static final getMyStruct = module
.lookupFunction<GetMyStructNative, GetMyStruct>('getMyStruct');
// call native function and get native struct
MyStructType myStruct = getMyStruct();
/***************************** OUTPUT *************************/
final count = myStruct.count;
print("count: $count"); // prints some big number like 475423 that's not 0 (incorrect)
final intPtr = myStruct.intPtr.value;
print("count: $intPtr"); // prints 22 (correct)
final name = myStruct.name.toDartString();
print("name: $name"); // prints 'some string' (correct)
final floatPtr myStruct.floatPtr.asTypedList(3);
print("floatPtr: $floatPtr"); // prints [0.0, 0.0, 4.764414778704378e-44] (incorrect)
1条答案
按热度按时间d7v8vwbk1#
从github上的@blaugold得到了这个答案。结构体中字段的顺序必须匹配。所以如下所示修改dart结构体可以解决这个问题。