|  | // Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file | 
|  | // for details. All rights reserved. Use of this source code is governed by a | 
|  | // BSD-style license that can be found in the LICENSE file. | 
|  |  | 
|  | import 'dart:ffi'; | 
|  |  | 
|  | import 'package:ffi/ffi.dart'; | 
|  |  | 
|  | import 'coordinate.dart'; | 
|  | import 'dylib_utils.dart'; | 
|  |  | 
|  | typedef NativeCoordinateOp = Pointer<Coordinate> Function(Pointer<Coordinate>); | 
|  |  | 
|  | main() { | 
|  | print('start main'); | 
|  |  | 
|  | DynamicLibrary ffiTestFunctions = dlopenPlatformSpecific( | 
|  | "ffi_test_functions", | 
|  | ); | 
|  |  | 
|  | { | 
|  | // Pass a struct to a c function and get a struct as return value. | 
|  | Pointer<NativeFunction<NativeCoordinateOp>> p1 = ffiTestFunctions.lookup( | 
|  | "TransposeCoordinate", | 
|  | ); | 
|  | NativeCoordinateOp f1 = p1.asFunction(); | 
|  |  | 
|  | final c1 = calloc<Coordinate>() | 
|  | ..ref.x = 10.0 | 
|  | ..ref.y = 20.0; | 
|  | final c2 = calloc<Coordinate>() | 
|  | ..ref.x = 42.0 | 
|  | ..ref.y = 84.0 | 
|  | ..ref.next = c1; | 
|  | c1.ref.next = c2; | 
|  |  | 
|  | Coordinate result = f1(c1).ref; | 
|  |  | 
|  | print(c1.ref.x); | 
|  | print(c1.ref.y); | 
|  |  | 
|  | print(result.runtimeType); | 
|  |  | 
|  | print(result.x); | 
|  | print(result.y); | 
|  | } | 
|  |  | 
|  | { | 
|  | // Pass an array of structs to a c function. | 
|  | Pointer<NativeFunction<NativeCoordinateOp>> p1 = ffiTestFunctions.lookup( | 
|  | "CoordinateElemAt1", | 
|  | ); | 
|  | NativeCoordinateOp f1 = p1.asFunction(); | 
|  |  | 
|  | Pointer<Coordinate> c1 = calloc<Coordinate>(3); | 
|  | Pointer<Coordinate> c2 = c1 + 1; | 
|  | Pointer<Coordinate> c3 = c1 + 2; | 
|  | c1.ref.x = 10.0; | 
|  | c1.ref.y = 10.0; | 
|  | c1.ref.next = c3; | 
|  | c2.ref.x = 20.0; | 
|  | c2.ref.y = 20.0; | 
|  | c2.ref.next = c1; | 
|  | c3.ref.x = 30.0; | 
|  | c3.ref.y = 30.0; | 
|  | c3.ref.next = c2; | 
|  |  | 
|  | Coordinate result = f1(c1).ref; | 
|  |  | 
|  | print(result.x); | 
|  | print(result.y); | 
|  | } | 
|  |  | 
|  | print("end main"); | 
|  | } |