• [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:	est中文abc.txt';
    final text = GbkEncoder().convert(fileName ).skip(0);
    
    final Pointer<ffi.Utf8> strPtr = text.toNativeRaw();
    try {
      // 调用目标,文件名参数使用 strPtr
      ...
    } finally {
      ffi.malloc.free(strPtr);
    }
    

    END

  • 相关阅读:
    linux grep命令
    PHP 利用simplexml_load_file 读取XML对应的字段 然后存入mysql数据库
    php 设计模式之单类模式
    Mac C#开发工具Rider安利与环境配置教程
    模拟,贪心,枚举(二)
    模拟,贪心,枚举
    10.10 review
    review 10.9
    10.6 review
    9.28 review
  • 原文地址:https://www.cnblogs.com/yangyxd/p/15495215.html
Copyright © 2020-2023  润新知