Что такое «Родной тип» для » char*» в dart FFI?

#dart #ffi #dart-ffi

Вопрос:

У меня есть такая функция в C :

 char* getString() {
    return "SOME_STRING";
}
 

теперь я хочу вызвать его с помощью FFI in dart , и это мой код:

 import 'dart:io';
import 'dart:ffi';

void main(List<String> arguments) {
  print('${getString()}');
}

final DynamicLibrary nativeAppTokenLib = Platform.isAndroid
    ? DynamicLibrary.open('lib_native_get_string.so')
    : DynamicLibrary.process();

final String Function() getString = nativeAppTokenLib
    .lookup<NativeFunction<HERE!!! Function()>>('getString')
    .asFunction();
 

Интересно, что я должен поставить вместо HERE!!! родного типа?

Ответ №1:

Попробуй:

 import 'dart:ffi';
import 'dart:io';
import "package:ffi/ffi.dart";

...

final Pointer<Utf8> Function() _getString = nativeAppTokenLib
    .lookup<NativeFunction<Pointer<Utf8> Function()>>('getString')
    .asFunction();
String getString() => _getString().toDartString();
 

При этом package:ffi Utf8 для представления символов используется тип «s». Метод расширения toDartString on Pointer<Utf8> предназначен для преобразования их в строку.