メインコンテンツにスキップ

ffi_native_only_classes_extending_nativefieldwrapperclass1_can_be_pointer

NativeFieldWrapperClass1 を拡張するクラスのみが Pointer として渡すことができます。

説明

#

@Native アノテーションが付与された関数またはメソッドの FFI シグネチャに、Pointer 型のパラメータがあるにもかかわらず、対応する Dart のパラメータ型が NativeFieldWrapperClass1 を拡張しないクラスインスタンス(または PointerTypedData)である場合に、アナライザーはこの診断を生成します。

#

以下のコードでは、MyServiceNativeFieldWrapperClass1 を拡張していないため、この診断が生成されます。しかし、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 シグネチャを、パラメータの Pointer の代わりに Handle を使用するように変更してください。これにより、Dart オブジェクト自体の参照を渡すことができるようになり、ネイティブコードは Dart C API を使用して対話できます。

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