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)}');
}