// Copyright (c) 2020, 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. // // SharedObjects=ffi_test_functions import 'dart:ffi'; import 'package:expect/expect.dart'; import 'dylib_utils.dart'; void main() { doDynamicLinking(); testHandle(); testNativeAPIs(); } void doDynamicLinking() { Expect.isTrue(NativeApi.majorVersion == 2); Expect.isTrue(NativeApi.minorVersion >= 2); final initializeApi = testLibrary .lookupFunction< IntPtr Function(Pointer), int Function(Pointer) >("InitDartApiDL"); Expect.isTrue(initializeApi(NativeApi.initializeApiDLData) == 0); } void testHandle() { final s = SomeClass(123); print("passObjectToC($s)"); final result = passObjectToC(s); print("result = $result"); Expect.isTrue(identical(s, result)); } void testNativeAPIs() { // No need to expect here, `lookupFunction` throws an argument error if lookup fails. Expect.isTrue(testLibrary.providesSymbol("Dart_IsNull_DL")); testLibrary.lookupFunction( "Dart_IsNull_DL", ); Expect.isTrue(NativeApi.majorVersion == 2); Expect.isTrue(NativeApi.minorVersion >= 4); Expect.isTrue(testLibrary.providesSymbol("Dart_Null_DL")); testLibrary.lookupFunction( "Dart_Null_DL", ); } class SomeClass { // We use this getter in the native api, don't tree shake it. @pragma("vm:entry-point") final int a; SomeClass(this.a); } final testLibrary = dlopenPlatformSpecific("ffi_test_functions"); final passObjectToC = testLibrary .lookupFunction( "PassObjectToCUseDynamicLinking", );