void main()

in ffi/primitives/primitives.dart [44:99]


void main() {
  // Open the dynamic library
  var libraryPath = path.join(
      Directory.current.path, 'primitives_library', 'libprimitives.so');
  if (Platform.isMacOS) {
    libraryPath = path.join(
        Directory.current.path, 'primitives_library', 'libprimitives.dylib');
  }
  if (Platform.isWindows) {
    libraryPath = path.join(
        Directory.current.path, 'primitives_library', 'Debug', 'primtives.dll');
  }

  final dylib = DynamicLibrary.open(libraryPath);

  // calls int sum(int a, int b);
  final sumPointer = dylib.lookup<NativeFunction<SumFunc>>('sum');
  final sum = sumPointer.asFunction<Sum>();
  print('3 + 5 = ${sum(3, 5)}');

  // calls int subtract(int *a, int b);
  // Create a pointer
  final p = calloc<Int32>();
  // Place a value into the address
  p.value = 3;

  final subtractPointer =
      dylib.lookup<NativeFunction<SubtractFunc>>('subtract');
  final subtract = subtractPointer.asFunction<Subtract>();
  print('3 - 5 = ${subtract(p, 5)}');

  // Free up allocated memory.
  calloc.free(p);

  // calls int *multiply(int a, int b);
  final multiplyPointer =
      dylib.lookup<NativeFunction<MultiplyFunc>>('multiply');
  final multiply = multiplyPointer.asFunction<Multiply>();
  final resultPointer = multiply(3, 5);
  // Fetch the result at the address pointed to
  final int result = resultPointer.value;
  print('3 * 5 = $result');

  // Free up allocated memory. This time in C, because it was allocated in C.
  final freePointerPointer =
      dylib.lookup<NativeFunction<FreePointerFunc>>('free_pointer');
  final freePointer = freePointerPointer.asFunction<FreePointer>();
  freePointer(resultPointer);

  // example calling a C function with varargs
  // calls int multi_sum(int nr_count, ...);
  final multiSumPointer =
      dylib.lookup<NativeFunction<MultiSumFunc>>('multi_sum');
  final multiSum = multiSumPointer.asFunction<MultiSum>();
  print('3 + 7 + 11 = ${multiSum(3, 3, 7, 11)}');
}