diff --git a/app/src/main/java/net/kdt/pojavlaunch/BinaryExecutor.java b/app/src/main/java/net/kdt/pojavlaunch/BinaryExecutor.java index 69d190ab8..9396f2e5c 100644 --- a/app/src/main/java/net/kdt/pojavlaunch/BinaryExecutor.java +++ b/app/src/main/java/net/kdt/pojavlaunch/BinaryExecutor.java @@ -3,7 +3,22 @@ package net.kdt.pojavlaunch; // This class load and execute PIE binary using dlopen and dlsym("main") public class BinaryExecutor { - public static native int executeBinary(String ldLibraryPath, String[] args); + public static void initJavaRuntime() { + dlopen(Tools.homeJreDir + "/lib/jli/libjli.so"); + dlopen(Tools.homeJreDir + "/lib/server/libjvm.so"); + dlopen(Tools.homeJreDir + "/lib/libverify.so"); + dlopen(Tools.homeJreDir + "/lib/libjava.so"); + dlopen(Tools.homeJreDir + "/lib/libnet.so"); + dlopen(Tools.homeJreDir + "/lib/libnio.so"); + dlopen(Tools.homeJreDir + "/lib/libawt.so"); + dlopen(Tools.homeJreDir + "/lib/libawt_headless.so"); + + chdir(Tools.MAIN_PATH); + } + + public static native int chdir(String path); + public static native boolean dlopen(String libPath); + public static native int executeBinary(String[] args); static { System.loadLibrary("binexecutor"); diff --git a/app/src/main/java/net/kdt/pojavlaunch/MainActivity.java b/app/src/main/java/net/kdt/pojavlaunch/MainActivity.java index 66873835f..c2f5a4097 100644 --- a/app/src/main/java/net/kdt/pojavlaunch/MainActivity.java +++ b/app/src/main/java/net/kdt/pojavlaunch/MainActivity.java @@ -203,7 +203,6 @@ public class MainActivity extends AppCompatActivity implements OnTouchListener, setTitle("Minecraft " + mProfile.getVersion()); - initEnvs(); //System.loadLibrary("gl4es"); /* if (mVersionInfo.arguments != null) { @@ -882,21 +881,6 @@ public class MainActivity extends AppCompatActivity implements OnTouchListener, } } - public void initEnvs() { - try { - // Os.setenv("LIBGL_MIPMAP", "3", true); - - System.out.println("ldlib before = " + System.getenv("LD_LIBRARY_PATH")); - - Os.setenv("JAVA_HOME", Tools.homeJreDir, true); - Os.setenv("LIBGL_MIPMAP", "3", true); - - System.out.println("ldlib after = " + System.getenv("LD_LIBRARY_PATH")); - } catch (Exception e) { - Tools.showError(MainActivity.this, e, true); - } - } - private boolean isPointerCaptureSupported() { return Build.VERSION.SDK_INT >= 26; } @@ -998,11 +982,28 @@ public class MainActivity extends AppCompatActivity implements OnTouchListener, Os.dup2(fd, OsConstants.STDERR_FILENO); Os.dup2(fd, OsConstants.STDOUT_FILENO); } + + public void initEnvs() { + try { + // Os.setenv("LIBGL_MIPMAP", "3", true); + + System.out.println("ldlib before = " + System.getenv("LD_LIBRARY_PATH")); + + Os.setenv("HOME", Tools.MAIN_PATH, true); + Os.setenv("JAVA_HOME", Tools.homeJreDir, true); + Os.setenv("LIBGL_MIPMAP", "3", true); + + System.out.println("ldlib after = " + System.getenv("LD_LIBRARY_PATH")); + } catch (Exception e) { + Tools.showError(MainActivity.this, e, true); + } + } public static String launchClassPath; public static String launchLibrarySearchPath; - private void runCraft() throws Throwable - { + private void runCraft() throws Throwable { + initEnvs(); + String[] launchArgs = getMCArgs(); // Setup OptiFine @@ -1023,12 +1024,25 @@ public class MainActivity extends AppCompatActivity implements OnTouchListener, System.out.println(); redirectStdio(); + BinaryExecutor.initJavaRuntime(); + + BinaryExecutor.dlopen(Tools.homeJreDir + "/bin/java"); List javaArgList = new ArrayList(); javaArgList.add(Tools.homeJreDir + "/bin/java"); // javaArgList.add("-Xms512m"); javaArgList.add("-Xmx512m"); + String libPath = "lib" + (Build.CPU_ABI.contains("64") ? "64" : ""); + javaArgList.add("-Djava.library.path=" + + "/system/" + libPath + ":" + + "/vendor/" + libPath + ":" + + "/vendor/" + libPath + "/hw:" + + // TODO lwjgl2 vs lwjgl3 native path + getApplicationInfo().nativeLibraryDir + ); + + javaArgList.add("-Djava.home=" + Tools.homeJreDir); javaArgList.add("-Duser.home=" + Tools.MAIN_PATH); // javaArgList.add("-Dorg.lwjgl.system.jemalloc.libname=libjemalloc.so"); @@ -1044,22 +1058,21 @@ public class MainActivity extends AppCompatActivity implements OnTouchListener, javaArgList.add(mVersionInfo.mainClass); javaArgList.addAll(Arrays.asList(launchArgs)); - try { - String libPath = "lib" + (Build.CPU_ABI.contains("64") ? "64" : ""); - BinaryExecutor.executeBinary( - "/system/" + libPath + ":" + - "/vendor/" + libPath + ":" + - "/vendor/" + libPath + "/hw:" + - getApplicationInfo().nativeLibraryDir + ":" + - Tools.homeJreDir + "/lib:" + - Tools.homeJreDir + "/lib/jli:" + - Tools.homeJreDir + "/lib/server", - - javaArgList.toArray(new String[0]) - ); - } catch (Throwable th) { - Tools.showError(this, th, true); - } +/* + ShellProcessOperation sp = new ShellProcessOperation(new ShellProcessOperation.OnPrintListener(){ + + @Override + public void onPrintLine(String text) { + appendlnToLog(text, false); + } + }); + sp.initInputStream(this); + sp.writeToProcess("export LD_LIBRARY_PATH=" + Tools.homeJreDir + "/lib/jli:" + Tools.homeJreDir + "/lib/server:" + Tools.homeJreDir + "/lib"); + sp.writeToProcess(javaArgList.toArray(new String[0])); +*/ + + BinaryExecutor.executeBinary(javaArgList.toArray(new String[0])); + /* "-Dorg.apache.logging.log4j.level=INFO", "-Dorg.apache.logging.log4j.simplelog.level=INFO", diff --git a/app/src/main/java/net/kdt/pojavlaunch/ShellProcessOperation.java b/app/src/main/java/net/kdt/pojavlaunch/ShellProcessOperation.java index 818e67e11..d295d6ec5 100644 --- a/app/src/main/java/net/kdt/pojavlaunch/ShellProcessOperation.java +++ b/app/src/main/java/net/kdt/pojavlaunch/ShellProcessOperation.java @@ -20,6 +20,12 @@ public class ShellProcessOperation ); //"/system/bin/sh -c \"" + command + "\""); } + public void writeToProcess(String[] cmdArr) throws IOException { + StringBuilder sb = new StringBuilder(); + for (String cmd : cmdArr) {sb.append(cmd + " ");} + writeToProcess(sb.toString()); + } + public void writeToProcess(String cmd) throws IOException { DataOutputStream os = new DataOutputStream(process.getOutputStream()); os.writeBytes(cmd + "\n"); diff --git a/app/src/main/jniLibs/arm64-v8a/libbinexecutor.so b/app/src/main/jniLibs/arm64-v8a/libbinexecutor.so index 37ca16e3c..d5d67f662 100644 Binary files a/app/src/main/jniLibs/arm64-v8a/libbinexecutor.so and b/app/src/main/jniLibs/arm64-v8a/libbinexecutor.so differ diff --git a/app/src/main/jniLibs/armeabi-v7a/libbinexecutor.so b/app/src/main/jniLibs/armeabi-v7a/libbinexecutor.so index 821da30e3..a19de2b5b 100644 Binary files a/app/src/main/jniLibs/armeabi-v7a/libbinexecutor.so and b/app/src/main/jniLibs/armeabi-v7a/libbinexecutor.so differ diff --git a/app/src/main/jniLibs/x86/libbinexecutor.so b/app/src/main/jniLibs/x86/libbinexecutor.so index b1175d6c2..441575ff8 100644 Binary files a/app/src/main/jniLibs/x86/libbinexecutor.so and b/app/src/main/jniLibs/x86/libbinexecutor.so differ diff --git a/app/src/main/jniLibs/x86_64/libbinexecutor.so b/app/src/main/jniLibs/x86_64/libbinexecutor.so index f86a27bf9..f33718e50 100644 Binary files a/app/src/main/jniLibs/x86_64/libbinexecutor.so and b/app/src/main/jniLibs/x86_64/libbinexecutor.so differ