[Flutter] FFI之生成Ansi字串指標
阿新 • • 發佈:2021-11-01
場景
在 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); }