From 52b50ed5785213347ae0c113679860779a2cb788 Mon Sep 17 00:00:00 2001 From: Brian Quinlan Date: Tue, 3 Sep 2024 13:54:35 -0700 Subject: [PATCH] Support dynamic and static linking --- pkgs/cupertino_http/lib/src/utils.dart | 35 +++++++++++++++++--------- 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/pkgs/cupertino_http/lib/src/utils.dart b/pkgs/cupertino_http/lib/src/utils.dart index 7bc87aa87c..6f7fd8357b 100644 --- a/pkgs/cupertino_http/lib/src/utils.dart +++ b/pkgs/cupertino_http/lib/src/utils.dart @@ -27,21 +27,32 @@ final ncb.NativeCupertinoHttp linkedLibs = () { /// library. final ncb.NativeCupertinoHttp helperLibs = _loadHelperLibrary(); -DynamicLibrary _loadHelperDynamicLibrary() { - if (Platform.isMacOS || Platform.isIOS) { - return DynamicLibrary.open('$_libName.framework/$_libName'); +ncb.NativeCupertinoHttp _loadHelperLibrary() { + if (!Platform.isMacOS && !Platform.isIOS) { + throw UnsupportedError( + 'Platform ${Platform.operatingSystem} is not supported'); } - throw UnsupportedError( - 'Platform ${Platform.operatingSystem} is not supported'); -} - -ncb.NativeCupertinoHttp _loadHelperLibrary() { - final lib = _loadHelperDynamicLibrary(); + late DynamicLibrary lib; + late int Function(Pointer) initializeApi; + late int initializeResult; + + lib = DynamicLibrary.process(); + try { + initializeApi = lib.lookupFunction), + int Function(Pointer)>('Dart_InitializeApiDL'); + // ignore: avoid_catching_errors + } on ArgumentError { + // Dart_InitializeApiDL is not available in the current process. Assume + // that is was build as a dynamic library. + // TODO: remove this when package:cupertino_http no longer supports + // CocoaPods (which uses dynamic linking). + lib = DynamicLibrary.open('$_libName.framework/$_libName'); + initializeApi = lib.lookupFunction), + int Function(Pointer)>('Dart_InitializeApiDL'); + } - final initializeApi = lib.lookupFunction), - int Function(Pointer)>('Dart_InitializeApiDL'); - final initializeResult = initializeApi(NativeApi.initializeApiDLData); + initializeResult = initializeApi(NativeApi.initializeApiDLData); if (initializeResult != 0) { throw StateError('failed to init API.'); }