From d2ec05c5495dbfb0caf07a7446b6fc32e2140272 Mon Sep 17 00:00:00 2001 From: Duy Tran Khanh Date: Fri, 1 Jan 2021 10:20:52 +0700 Subject: [PATCH] Try start java inside main() Invoke map: C main() calls JLI_Launch -> Java main() calls UIApplicationMain -> AppDelegate: didFinishLaunchingWithOptions callback to Java -> Init OpenGL ES and start Minecraft client. (TODO) --- .../java/net/kdt/pojavlaunch/PLaunchApp.java | 5 ++ Natives/AppDelegate.m | 2 +- Natives/CMakeLists.txt | 2 +- Natives/JavaLauncher.c | 59 ++++++++++++------- Natives/JavaLauncher.h | 8 ++- Natives/UILauncher.m | 14 +++++ Natives/main.c | 9 +++ Natives/main.m | 12 ---- 8 files changed, 75 insertions(+), 36 deletions(-) create mode 100644 Natives/UILauncher.m create mode 100644 Natives/main.c delete mode 100644 Natives/main.m diff --git a/JavaApp/src/main/java/net/kdt/pojavlaunch/PLaunchApp.java b/JavaApp/src/main/java/net/kdt/pojavlaunch/PLaunchApp.java index 4ab32da3..9f3740c9 100644 --- a/JavaApp/src/main/java/net/kdt/pojavlaunch/PLaunchApp.java +++ b/JavaApp/src/main/java/net/kdt/pojavlaunch/PLaunchApp.java @@ -77,6 +77,9 @@ public class PLaunchApp /* extends UIApplicationDelegateAdapter */ { } */ + System.out.println("We are on java now! Starting UI..."); + launchUI(); + LauncherPreferences.loadPreferences(); System.setProperty("java.library.path", Tools.DIR_DATA + "/Frameworks"); @@ -119,4 +122,6 @@ public class PLaunchApp /* extends UIApplicationDelegateAdapter */ { Tools.showError(th); } } + + public static native void launchUI(); } diff --git a/Natives/AppDelegate.m b/Natives/AppDelegate.m index f562af38..aa2ccb40 100644 --- a/Natives/AppDelegate.m +++ b/Natives/AppDelegate.m @@ -14,7 +14,7 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { - launchJVM(); + // TODO callback return YES; } diff --git a/Natives/CMakeLists.txt b/Natives/CMakeLists.txt index fd0e20ac..223f735f 100644 --- a/Natives/CMakeLists.txt +++ b/Natives/CMakeLists.txt @@ -4,7 +4,7 @@ project(PojavLauncher) # set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") set(CMAKE_C_FLAGS "-x objective-c") -add_executable(PojavLauncher main.m AppDelegate.m JavaLauncher.c) +add_executable(PojavLauncher main.c AppDelegate.m UILauncher.m JavaLauncher.c) target_link_libraries(PojavLauncher "-framework UIKit" ) diff --git a/Natives/JavaLauncher.c b/Natives/JavaLauncher.c index 51956d68..cb65c09a 100644 --- a/Natives/JavaLauncher.c +++ b/Natives/JavaLauncher.c @@ -4,6 +4,7 @@ #include #include #include +#include #include #include @@ -45,7 +46,7 @@ void append(char* s, char* c) { s[len+1] = '\0'; } -int launchJVM() { +int launchJVM(int argc, char *argv[]) { printf("Beginning JVM launch\n"); mkdir("/var/mobile/Documents/minecraft", 0700); @@ -61,28 +62,33 @@ int launchJVM() { dup2(log_fd, 2); close(log_fd); - int margv = 0; - char* margc[1000]; - margc[margv++] = "/usr/lib/jvm/java-16-openjdk/bin/java"; - - printf("Reading custom JVM args (overrideargs.txt)"); - char jvmargs[10000]; - FILE* argsFile = fopen(args_path, "r"); - if (argsFile) { - fscanf(argsFile, "%s", jvmargs); - char *pch; - pch = strtok(jvmargs, " "); - while (pch != NULL) { - margc[margv++] = pch; - pch = strtok(NULL, " "); + int margc = 0; + char* margv[1000]; + // Check if JVM restarts + if (!started) { + margv[margc++] = "/usr/lib/jvm/java-16-openjdk/bin/java"; + printf("Reading custom JVM args (overrideargs.txt)"); + char jvmargs[10000]; + FILE* argsFile = fopen(args_path, "r"); + if (argsFile) { + fscanf(argsFile, "%s", jvmargs); + char *pch; + pch = strtok(jvmargs, " "); + while (pch != NULL) { + margv[margc++] = pch; + pch = strtok(NULL, " "); + } + fclose(argsFile); + } + margv[margc++] = "-cp"; + margv[margc++] = main_jar; + margv[margc++] = "net.kdt.pojavlaunch.PLaunchApp"; + + for (int i = 0; i < argc; i++) { + margv[margc++] = argv[i]; } - fclose(argsFile); } - margc[margv++] = "-cp"; - margc[margv++] = main_jar; - margc[margv++] = "net.kdt.pojavlaunch.PLaunchApp"; - // Load java void* libjli = dlopen("/usr/lib/jvm/java-16-openjdk/lib/libjli.dylib", RTLD_LAZY | RTLD_GLOBAL); @@ -101,8 +107,15 @@ int launchJVM() { } printf("Calling JLI_Launch\n"); + + int targc = started ? argc : margc; + char *targv[] targv = started ? argv : margv; + + if (!started) { + started = true; + } - return pJLI_Launch(margc, margv, + return pJLI_Launch(targc, targv, 0, NULL, // sizeof(const_jargs) / sizeof(char *), const_jargs, 0, NULL, // sizeof(const_appclasspath) / sizeof(char *), const_appclasspath, FULL_VERSION, @@ -112,3 +125,7 @@ int launchJVM() { (const_jargs != NULL) ? JNI_TRUE : JNI_FALSE, const_cpwildcard, const_javaw, const_ergo_class); } + +JNIEXPORT jint JNICALL Java_net_kdt_pojavlaunch_PLaunchApp_launchUI(JNIEnv* env, jclass clazz) { + return launchUI(); +} diff --git a/Natives/JavaLauncher.h b/Natives/JavaLauncher.h index fe652332..7c3e530c 100644 --- a/Natives/JavaLauncher.h +++ b/Natives/JavaLauncher.h @@ -1,3 +1,9 @@ #pragma once -int launchJVM(); +static bool started = false; + +static int first_argc; +static char *first_argv[]; + +int launchJVM(int argc, char *argv[]); +int launchUI(); diff --git a/Natives/UILauncher.m b/Natives/UILauncher.m new file mode 100644 index 00000000..72474997 --- /dev/null +++ b/Natives/UILauncher.m @@ -0,0 +1,14 @@ +// +// main.m +// + +#import +#import "AppDelegate.h" + +#include "JavaLauncher.h" + +int launchUI() { + @autoreleasepool { + return UIApplicationMain(first_argc, first_argv, nil, NSStringFromClass([AppDelegate class])); + } +} diff --git a/Natives/main.c b/Natives/main.c new file mode 100644 index 00000000..11e26dfe --- /dev/null +++ b/Natives/main.c @@ -0,0 +1,9 @@ +#include "JavaLauncher.h" + +int main(int argc, char * argv[]) { + if (!started) { + first_argc = argc; + first_argv = argv; + } + launchJVM(argc, argv); +} diff --git a/Natives/main.m b/Natives/main.m deleted file mode 100644 index 2e91bc36..00000000 --- a/Natives/main.m +++ /dev/null @@ -1,12 +0,0 @@ -// -// main.m -// - -#import -#import "AppDelegate.h" - -int main(int argc, char * argv[]) { - @autoreleasepool { - return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); - } -}