|  | // 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 'dart:io'; | 
|  |  | 
|  | const arm = 'arm'; | 
|  | const arm64 = 'arm64'; | 
|  | const ia32 = 'ia32'; | 
|  | const x64 = 'x64'; | 
|  |  | 
|  | // https://stackoverflow.com/questions/45125516/possible-values-for-uname-m | 
|  | final _unames = { | 
|  | 'arm': arm, | 
|  | 'aarch64_be': arm64, | 
|  | 'aarch64': arm64, | 
|  | 'armv8b': arm64, | 
|  | 'armv8l': arm64, | 
|  | 'i386': ia32, | 
|  | 'i686': ia32, | 
|  | 'x86_64': x64, | 
|  | }; | 
|  |  | 
|  | String _checkRunningMode(String architecture) { | 
|  | // Check if we're running in 32bit mode. | 
|  | final int pointerSize = sizeOf<IntPtr>(); | 
|  | if (pointerSize == 4 && architecture == x64) return ia32; | 
|  | if (pointerSize == 4 && architecture == arm64) return arm; | 
|  |  | 
|  | return architecture; | 
|  | } | 
|  |  | 
|  | String _architecture() { | 
|  | final String uname = Process.runSync('uname', ['-m']).stdout.trim(); | 
|  | final String? architecture = _unames[uname]; | 
|  | if (architecture == null) { | 
|  | throw Exception('Unrecognized architecture: "$uname"'); | 
|  | } | 
|  |  | 
|  | // Check if we're running in 32bit mode. | 
|  | return _checkRunningMode(architecture); | 
|  | } | 
|  |  | 
|  | String _platformPath(String name, String path) { | 
|  | if (Platform.isMacOS || Platform.isIOS) { | 
|  | return '${path}mac/${_architecture()}/lib$name.dylib'; | 
|  | } | 
|  |  | 
|  | if (Platform.isWindows) { | 
|  | return '${path}win/${_checkRunningMode(x64)}/$name.dll'; | 
|  | } | 
|  |  | 
|  | // Unknown platforms default to Unix implementation. | 
|  | return '${path}linux/${_architecture()}/lib$name.so'; | 
|  | } | 
|  |  | 
|  | DynamicLibrary dlopenPlatformSpecific(String name, {String path = ''}) { | 
|  | final String fullPath = _platformPath(name, path); | 
|  | return DynamicLibrary.open(fullPath); | 
|  | } |