1. 程式人生 > 其它 >[Flutter] FFI之生成Ansi字串指標

[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