将浮点指针和Int从Native C获取到Dart时出现问题

46qrfjad  于 2023-02-03  发布在  其他
关注(0)|答案(1)|浏览(71)

我有一个基本的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)
d7v8vwbk

d7v8vwbk1#

从github上的@blaugold得到了这个答案。结构体中字段的顺序必须匹配。所以如下所示修改dart结构体可以解决这个问题。

class MyStructType extends Struct {
  external Pointer<Float> floatPtr;

  // Int32 -> Int
  @Int() 
  external int count;

  // The order of fields matters, so `name` and `intPtr` need to be flipped.
  external Pointer<Utf8> name;
  external Pointer<Int> intPtr;
}

相关问题