Native class - dart:ffi library (original) (raw)
Annotation binding an external declaration to its native implementation.
Can only be applied to external
declarations of static and top-level functions and variables.
A Native-annotated external
function is implemented by native code. The implementation is found in the native library denoted by assetId. Similarly, a Native-annotated external
variable is implemented by reading from or writing to native memory.
The compiler and/or runtime provides a binding from assetId to native library, which depends on the target platform. The compiler/runtime can then resolve/lookup symbols (identifiers) against the native library, to find a native function or a native global variable, and bind an external
Dart function or variable declaration to that native declaration. By default, the runtime expects a native symbol with the same name as the annotated function or variable in Dart. This can be overridden with thesymbol parameter on the annotation.
When used on a function, T
must be a function type that represents the native function's parameter and return types. The parameter and return types must be subtypes of NativeType.
When used on a variable, T
must be a compatible native type. For example, an int field can be annotated with Int32.
If the type argument T
is omitted in the @Native
annotation, it is inferred from the static type of the declaration, which must meet the following constraints:
For function or method declarations:
- The return type must be one of the following:
- The parameter types must be subtypes of compound types or Pointer
For variable declarations, the type can be any of the following:
For native global variables that cannot be reassigned, a final
variable in Dart or a getter can be used to prevent modifications to the native field.
Example:
@Native<Int64 Function(Int64, Int64)>()
external int sum(int a, int b);
@Native()
external void free(Pointer p);
@Native<Int64>()
external int aGlobalInt;
@Native()
external final Pointer<Char> aGlobalString;
Calling a @Native
function, as well as reading or writing to a @Native
variable, will try to resolve the symbol in (in the order):
- the provided or default assetId,
- the native resolver set with
Dart_SetFfiNativeResolver
indart_api.h
, and - the current process.
At least one of those three must provide a binding for the symbol, otherwise the method call or the variable access fails.
NOTE: This is an experimental feature and may change in the future.
Annotations
- @Since('2.19')
Constructors
Native({String? assetId, bool isLeaf = false, String? symbol})
const
Properties
The ID of the asset in which symbol is resolved, if not using the default.
final
The hash code for this object.
no setterinherited
Whether the function is a leaf function.
final
A representation of the runtime type of the object.
no setterinherited
The native symbol to be resolved, if not using the default.
final
Methods
noSuchMethod(Invocation invocation)→ dynamic
Invoked when a nonexistent method or property is accessed.
inherited
A string representation of this object.
inherited
Operators
operator ==(Object other)→ bool
The equality operator.
inherited
Static Methods
addressOf<T extends NativeType>(Object native)→ Pointer<T>
The native address of the implementation of native
.