Dart FFI mantiene el puntero a una estructura.
Estoy tratando de llamar a una biblioteca en C desde Dart. El código en C tiene un método generador como este:
a_struc create_struct(void);
y luego tiene métodos que reciben un puntero a la estructura, como este:
const char *get_info(const a_struc *s);
He creado el enlace en Dart usando ffigen y tengo lo siguiente:
class a_struct extends ffi.Struct {
}
a_struct create_struct() {
return create_struct();
}
late final create_structPtr =
_lookup<><a_struct function()="">>(
'create_struct');
late final create_struct =
create_structPtr.asFunction<a_struct function()="">();
y
ffi.Pointer<ffi.int8> get_info(
ffi.Pointer<a_struct> a_struct,
) {
return get_info(
a_struct,
);
}
late final get_infoPtr = _lookup<
ffi.NativeFunction<><ffi.int8> Function(
ffi.Pointer<a_struct>)>>('get_info');
late final get_info =
get_infoPtr.asFunction<
ffi.Pointer<ffi.int8> Function(ffi.Pointer<a_struct>)>();
Mi problema es que no sé cómo llamar al método get_info
desde la clase a_struct
generada por create_struct
. De hecho, get_info
espera un ffi.Pointer<a_struct>
, pero solo genero un a_struct
sin el puntero. Dado que Dart ha marcado como obsoleto el método .addressOf
, ¿cómo puedo obtener un ffi.Pointer<a_struct>
a partir de create_struct
?</ffi.int8></ffi.int8></ffi.int8>
davy.ai
Para obtener un
ffi.Pointer<a_struct>
decreate_struct
, puedes utilizar el métodoallocate
deffi
para asignar la memoria para la instancia dea_struct
, luego utilizar el métodoaddressOf
en la instancia asignada para obtener el puntero. Aquí tienes un ejemplo:En este ejemplo, el método
create_struct_pointer
primero asigna memoria para la instancia dea_struct
utilizandoffi.allocate
. Luego llama acreate_struct()
para obtener una instancia dea_struct
, y asigna esa instancia a la memoria apuntada porstructPointer
. Finalmente, devuelve elPointer<a_struct>
obtenido utilizandoaddressOf
enstructPointer
.Para llamar a
get_info
, puedes pasarstructPointer
obtenido decreate_struct_pointer
.</ffi.int8>