[Flutter] FFI之生成Ansi字符串指针
场景
在 Flutter 中调用某个 dll 文件的函数A。其中参数 fileName 使用的是 ansi 字符串指针。
我们知道,Flutter 中的 String 实际上 utf-16, 现有的 String 转字符串指针的方法有 toNativeUtf8
、toNativeUtf16
。
解决办法
第一步: 引入第三方包 fast_gbk
, 它提供了转码的实现。
第二步: 增加一个 StringPointer 辅助函数
/// Extension method for converting a [String] to a `Pointer<Utf8>`.
extension StringPointer on String {
/// 原始字符串指针,不作任何转码
Pointer<ffi.Utf8> toNativeRaw({Allocator allocator = ffi.malloc}) {
final units = this.codeUnits;
final Pointer<Uint8> result = allocator<Uint8>(units.length + 1);
final Uint8List nativeString = result.asTypedList(units.length + 1);
nativeString.setAll(0, units);
nativeString[units.length] = 0;
return result.cast();
}
}
第三步:
import 'dart:ffi';
import 'package:fast_gbk/fast_gbk.dart';
import 'package:ffi/ffi.dart' as ffi;
...
final fileName = 'C:\test\中文abc.txt';
final text = GbkEncoder().convert(fileName ).skip(0);
final Pointer<ffi.Utf8> strPtr = text.toNativeRaw();
try {
// 调用目标,文件名参数使用 strPtr
...
} finally {
ffi.malloc.free(strPtr);
}