zoukankan      html  css  js  c++  java
  • [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

  • 相关阅读:
    Id vs Instancetype
    【转】为什么要走出你的心理“舒适区”
    【转】深入浅出 iOS 之生命周期
    【转】Objective-C类初始化:load与initialize
    【转】Cocoapod 的安装和使用
    非对称加密回顾
    iOS中 Proxy和的delegate区别
    IOS 对JSON解析的要求
    内存对齐规则
    KVO 的进一步理解
  • 原文地址:https://www.cnblogs.com/yangyxd/p/15495215.html
Copyright © 2011-2022 走看看