diff --git a/JavaApp/src/main/java/net/kdt/pojavlaunch/PLaunchApp.java b/JavaApp/src/main/java/net/kdt/pojavlaunch/PLaunchApp.java index f74e9a2a..fdc67f84 100644 --- a/JavaApp/src/main/java/net/kdt/pojavlaunch/PLaunchApp.java +++ b/JavaApp/src/main/java/net/kdt/pojavlaunch/PLaunchApp.java @@ -124,16 +124,17 @@ public class PLaunchApp { File outLib; String libPathURL; + Tools.preProcessLibraries(mVersion.libraries); for (final DependentLibrary libItem : mVersion.libraries) { - if ( - // Support for text2speech is not planned, so skip it for now. - libItem.name.startsWith("com.mojang.text2speech") || - libItem.name.startsWith("net.java.jinput") || - libItem.name.startsWith("org.lwjgl") - ) { // Black list + if (libItem._skip) { currProgress++; - UIKit.updateProgressSafe(currProgress / maxProgress, "Ignored " + libItem.name); + UIKit.updateProgressSafe(currProgress / maxProgress, "Skipped " + libItem.name); // Thread.sleep(100); + + String[] libInfo = libItem.name.split(":"); + String libArtifact = Tools.artifactToPath(libInfo[0], libInfo[1], libInfo[2]); + outLib = new File(Tools.DIR_HOME_LIBRARY + "/" + libArtifact); + outLib.delete(); } else { String[] libInfo = libItem.name.split(":"); String libArtifact = Tools.artifactToPath(libInfo[0], libInfo[1], libInfo[2]); diff --git a/JavaApp/src/main/java/net/kdt/pojavlaunch/Tools.java b/JavaApp/src/main/java/net/kdt/pojavlaunch/Tools.java index ac2a362b..ee36df8a 100644 --- a/JavaApp/src/main/java/net/kdt/pojavlaunch/Tools.java +++ b/JavaApp/src/main/java/net/kdt/pojavlaunch/Tools.java @@ -394,10 +394,36 @@ public final class Tools act.startActivity(browserIntent); } */ + + public static void preProcessLibraries(DependentLibrary[] libraries) { + // Ignore some libraries since they are unsupported (jinput, text2speech) or unused (LWJGL) + // Support for text2speech is not planned, so skip it for now. + for (int i = 0; i < libraries.length; i++) { + DependentLibrary libItem = libraries[i]; + if (libItem.name.startsWith("com.mojang.text2speech") || + libItem.name.startsWith("net.java.jinput") || + libItem.name.startsWith("net.java.dev.jna:platform:") || + libItem.name.startsWith("org.lwjgl") || + libItem.name.startsWith("tv.twitch")) { + libItem._skip = true; + } else if (libItem.name.startsWith("net.java.dev.jna:jna:")) { + // Special handling for LabyMod 1.8.9 and Forge 1.12.2(?) + // we have libjnidispatch 5.8.0 in Frameworks directory + System.out.println("Library " + libItem.name + " has been changed to version 5.8.0"); + libItem.name = "net.java.dev.jna:jna:5.8.0"; + libItem.downloads.artifact.path = "net/java/dev/jna/jna/5.8.0/jna-5.8.0.jar"; + libItem.downloads.artifact.url = "https://libraries.minecraft.net/net/java/dev/jna/jna/5.8.0/jna-5.8.0.jar"; + } + } + } + public static String[] generateLibClasspath(JMinecraftVersionList.Version info) { List libDir = new ArrayList(); - for (DependentLibrary libItem: info.libraries) { + preProcessLibraries(info.libraries); + for (DependentLibrary libItem : info.libraries) { + if (libItem._skip) continue; + String[] libInfos = libItem.name.split(":"); libDir.add(Tools.DIR_HOME_LIBRARY + "/" + Tools.artifactToPath(libInfos[0], libInfos[1], libInfos[2])); } diff --git a/JavaApp/src/main/java/net/kdt/pojavlaunch/value/DependentLibrary.java b/JavaApp/src/main/java/net/kdt/pojavlaunch/value/DependentLibrary.java index 04c4a515..5aec5249 100644 --- a/JavaApp/src/main/java/net/kdt/pojavlaunch/value/DependentLibrary.java +++ b/JavaApp/src/main/java/net/kdt/pojavlaunch/value/DependentLibrary.java @@ -1,6 +1,8 @@ package net.kdt.pojavlaunch.value; public class DependentLibrary { + public boolean _skip; // internal + public String name; public LibraryDownloads downloads; public String url; diff --git a/Natives/JavaLauncher.m b/Natives/JavaLauncher.m index 797c6ce9..117b83fe 100644 --- a/Natives/JavaLauncher.m +++ b/Natives/JavaLauncher.m @@ -550,12 +550,14 @@ int launchJVM(int argc, char *argv[]) { if (!started) { char *frameworkPath = calloc(1, 2048); char *javaPath = calloc(1, 2048); + char *jnaLibPath = calloc(1, 2048); char *userDir = calloc(1, 2048); char *userHome = calloc(1, 2048); char *memMin = calloc(1, 2048); char *memMax = calloc(1, 2048); snprintf(frameworkPath, 2048, "-Djava.library.path=%s/Frameworks:%s/Frameworks/libOSMesaOverride.dylib.framework", getenv("BUNDLE_PATH"), getenv("BUNDLE_PATH")); snprintf(javaPath, 2048, "%s/bin/java", javaHome); + snprintf(jnaLibPath, 2048, "-Djna.boot.library.path=%s/Frameworks/libjnidispatch.dylib.framework", getenv("BUNDLE_PATH")); snprintf(userDir, 2048, "-Duser.dir=%s", getenv("POJAV_GAME_DIR")); snprintf(userHome, 2048, "-Duser.home=%s", getenv("POJAV_HOME")); snprintf(memMin, 2048, "-Xms%sM", allocmem); @@ -571,6 +573,7 @@ int launchJVM(int argc, char *argv[]) { margv[margc++] = memMin; margv[margc++] = memMax; margv[margc++] = frameworkPath; + margv[margc++] = jnaLibPath; margv[margc++] = userDir; margv[margc++] = userHome; margv[margc++] = "-Dorg.lwjgl.system.allocator=system"; diff --git a/Natives/resources/Frameworks/libjnidispatch.dylib.framework/Info.plist b/Natives/resources/Frameworks/libjnidispatch.dylib.framework/Info.plist new file mode 100644 index 00000000..5e115da6 --- /dev/null +++ b/Natives/resources/Frameworks/libjnidispatch.dylib.framework/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + libjnidispatch.dylib + CFBundleIconFile + + CFBundleIdentifier + + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + FMWK + CFBundleShortVersionString + 5.8.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + CSResourcesFileMapped + + + diff --git a/Natives/resources/Frameworks/libjnidispatch.dylib.framework/libjnidispatch.dylib b/Natives/resources/Frameworks/libjnidispatch.dylib.framework/libjnidispatch.dylib new file mode 100644 index 00000000..3d41daa1 Binary files /dev/null and b/Natives/resources/Frameworks/libjnidispatch.dylib.framework/libjnidispatch.dylib differ diff --git a/README.md b/README.md index 4ac094cb..1617addc 100644 --- a/README.md +++ b/README.md @@ -73,6 +73,7 @@ PojavLauncher is amazing, and surprisingly stable, and it wouldn't be this way w - [LWJGLX](https://github.com/PojavLauncherTeam/lwjglx) (LWJGL2 API compatibility layer for LWJGL3): unknown license. - [DBNumberedSlider](https://github.com/immago/DBNumberedSlider): [Apache 2.0 License](https://github.com/immago/DBNumberedSlider/blob/master/LICENSE) - [fishhook](https://github.com/facebook/fishhook) (jailed environment usage only): [BSD-3 License](https://github.com/facebook/fishhook/blob/main/LICENSE). +- [Java Native Access](https://github.com/java-native-access/jna): [Apache 2.0 License](https://github.com/java-native-access/jna/blob/master/LICENSE).