extractNativeLibraries method

  1. @override
Future<String> extractNativeLibraries()
override

Extracts native libraries required for Minecraft.

Returns the path to the extracted native libraries.

Implementation

@override
Future<String> extractNativeLibraries() async {
  _nativeLibrariesCompleter = Completer<void>();
  _activeCompleters.add(_nativeLibrariesCompleter!);

  final versionId = _profileManager.activeProfile.lastVersionId;
  final shouldProceed = await beforeExtractNativeLibraries(versionId);

  if (!shouldProceed) {
    debugPrint('Native libraries extraction skipped by beforeExtractNativeLibraries hook');
    _nativeLibrariesCompleter!.complete();
    return '';
  }

  final versionInfo = await fetchVersionManifest(versionId);

  if (versionInfo == null || versionInfo.libraries == null) {
    throw Exception('Failed to get libraries info for $versionId');
  }

  try {
    // 一時的なネイティブディレクトリパスを生成(後で実際のパスを決定)
    final tempNativesDir = _getNativesDir(versionId, 'temp');

    // 追加のネイティブライブラリJARファイルパスのリストを取得
    final additionalNativeLibraries = await getAdditionalNativeLibraries(
      versionId,
      tempNativesDir,
    );

    // 追加のライブラリがある場合はログに出力
    if (additionalNativeLibraries.isNotEmpty) {
      debugPrint('Additional native library JARs to extract: ${additionalNativeLibraries.length}');
      for (final jar in additionalNativeLibraries) {
        debugPrint('Additional JAR: $jar');
      }
    }

    // オリジナルのネイティブライブラリとカスタムネイティブライブラリを組み合わせて抽出
    final resultNativesDir = await _archivesManager.extractNativeLibraries(
      libraries: versionInfo.libraries!,
      versionId: versionId,
      gameDir: _gameDir,
      librariesDir: _getLibrariesDir(),
      getNativesDir: (libraryHash) => _getNativesDir(versionId, libraryHash),
      downloadFile: _downloadFile,
      additionalJars: additionalNativeLibraries,
    );

    _nativeLibrariesCompleter!.complete();
    await afterExtractNativeLibraries(versionId, resultNativesDir);
    return resultNativesDir;
  } catch (e) {
    _nativeLibrariesCompleter!.completeError(e);
    throw Exception('Failed to extract native libraries: $e');
  }
}