You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS 15 SDK未导出memcpy符号,Flutter FFI调用失败如何解决?

问题解答

一、苹果隐藏memcpy运行时符号的原因

该问题仅出现在iOS 15+模拟器环境,真机运行不受影响。苹果从Xcode 13对应iOS 15的模拟器运行时开始,对系统标准库的导出符号做了两级限制:

  1. memcpy这类基础内存操作函数在编译器层面默认做内联优化,原本就不会作为公开动态符号保留在系统库的导出表中
  2. 苹果收紧了模拟器环境下系统私有/非公开符号的访问权限,原本可通过RTLD_DEFAULT查找到的libsystem_c.dylib内部符号被标记为隐藏,直接用dlsym全局查找会返回符号不存在的错误。

二、可行解决方案

不存在通过podspec配置直接恢复系统隐藏符号的方案,你可以选择以下任意一种方式解决问题:

  • 优先使用Dart原生能力替代,无需调用C层memcpy
    dart:ffi从2.12版本开始已经内置了内存拷贝能力,你可以直接调用官方API,兼容全平台:
    // 方式1:使用Pointer自带的拷贝方法
    destPointer.copyFrom(srcPointer, length);
    // 方式2:通过TypedList操作
    destPointer.asTypedList(length).setRange(0, length, srcPointer.asTypedList(length));
    
  • 自己封装C层wrapper导出符号
    在你的iOS插件源码中新增一个C/C++文件,封装memcpy后主动导出符号:
    #include <string.h>
    __attribute__((used, visibility("default"))) 
    void* custom_memcpy(void* dest, const void* src, size_t len) {
      return memcpy(dest, src, len);
    }
    
    随后修改Dart侧代码查找custom_memcpy即可,该方案完全兼容所有iOS版本的模拟器和真机。
  • 直接加载对应系统库查找符号
    不使用全局进程符号表查找,指定加载libsystem_c.dylib后查找符号:
    final libSystem = DynamicLibrary.open("/usr/lib/system/libsystem_c.dylib");
    late final memcpy = libSystem.lookupFunction<_c_memcpy, _dart_memcpy>("memcpy");
    
    该方案依赖系统库路径和符号保留情况,后续系统版本升级可能失效,不推荐长期使用。

内容的提问来源于stack exchange,提问作者vaind

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 01:45:03