跳至主要内容

ffi_native_only_classes_extending_nativefieldwrapperclass1_can_be_pointer

只有扩展 NativeFieldWrapperClass1 的类才能作为 Pointer 传递。

描述

#

当使用 @Native 注解的函数或方法的 FFI 签名中有一个参数是 Pointer 类型,但对应的 Dart 参数类型是不扩展 NativeFieldWrapperClass1(也不是 Pointer 或 TypedData)的类实例时,分析器会生成此诊断信息。

示例

#

以下代码会生成此诊断信息,因为 MyService 没有扩展 NativeFieldWrapperClass1,但其 process 方法的 @Native 签名指示接收者应作为 Pointer<Void> 传递

dart
import 'dart:ffi';

class MyService { // MyService does not extend NativeFieldWrapperClass1
  @Native<Void Function(Pointer<Void>, Int8)>(symbol: 'MyService_process')
  external void process(int data);
}

常见修复方法

#
  1. 如果 Dart 类旨在包装原生对象: 使 Dart 类扩展 NativeFieldWrapperClass1。如果 Dart 类实例有一个相应的原生对象,并且应该传递该对象的指针,则这是正确的方法。

    dart
    import 'dart:ffi';
    
    class MyService extends NativeFieldWrapperClass1 {
      @Native<Void Function(Pointer<Void>, Int8)>(symbol: 'MyService_process')
      external void process(int data);
    }
  2. 如果您打算将 Dart 对象的不透明句柄传递给原生代码:@Native 注解中的 FFI 签名更改为使用 Handle 代替 Pointer 作为参数。这允许传递对 Dart 对象本身的引用,原生代码可以使用 Dart C API 与该对象进行交互。

    dart
    import 'dart:ffi';
    
    class MyService {
      @Native<Void Function(Handle, Int8)>(symbol: 'MyService_process')
      external void process(int data);
    }