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);
}
常见修复方法
#如果 Dart 类旨在包装原生对象: 使 Dart 类扩展
NativeFieldWrapperClass1
。如果 Dart 类实例有一个相应的原生对象,并且应该传递该对象的指针,则这是正确的方法。dartimport 'dart:ffi'; class MyService extends NativeFieldWrapperClass1 { @Native<Void Function(Pointer<Void>, Int8)>(symbol: 'MyService_process') external void process(int data); }
如果您打算将 Dart 对象的不透明句柄传递给原生代码: 将
@Native
注解中的 FFI 签名更改为使用Handle
代替Pointer
作为参数。这允许传递对 Dart 对象本身的引用,原生代码可以使用 Dart C API 与该对象进行交互。dartimport 'dart:ffi'; class MyService { @Native<Void Function(Handle, Int8)>(symbol: 'MyService_process') external void process(int data); }