[Flutter] FFI之生成Ansi字符串指针

场景

在 Flutter 中调用某个 dll 文件的函数A。其中参数 fileName 使用的是 ansi 字符串指针。

我们知道,Flutter 中的 String 实际上 utf-16, 现有的 String 转字符串指针的方法有 toNativeUtf8toNativeUtf16

解决办法

第一步: 引入第三方包 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);
}

END

posted @ 2021-11-01 18:04  我爱我家喵喵  阅读(474)  评论(0编辑  收藏  举报