diff --git a/app/src/main/assets/about_en.txt b/app/src/main/assets/about_en.txt
index 32081b156..9b664140b 100644
--- a/app/src/main/assets/about_en.txt
+++ b/app/src/main/assets/about_en.txt
@@ -2,12 +2,7 @@
* Using libraries:
• ClassWrapperMC: A simple wrapper to help launching Minecraft LaunchWrapper on JRE9 and later.
• gl4es: OpenGL for OpenGL ES devices by lunixbochs and ptitSeb.
- • LegacyLauncher: Open source Minecraft LaunchWrapper by Mojang.
• OpenJDK JRE 10 for Android by dongfangxunlei.
- • PRoot special build of Termux to bypass SECCOMP for OpenJDK run in Android 8.
- • TheQVD XVnc Pro (including Android VNC Viewer).
- • Some Debian libraries (X11, FreeType...)
- • Busybox.
• Apache Commons Compress.
• LWJGL.
* License:
diff --git a/app/src/main/java/net/kdt/pojavlaunch/InstallModActivity.java b/app/src/main/java/net/kdt/pojavlaunch/InstallModActivity.java
index 9e037dc5b..339993f17 100644
--- a/app/src/main/java/net/kdt/pojavlaunch/InstallModActivity.java
+++ b/app/src/main/java/net/kdt/pojavlaunch/InstallModActivity.java
@@ -142,7 +142,7 @@ public class InstallModActivity extends LoggableActivity
System.out.println(Arrays.toString(javaArgList.toArray(new String[0])));
//JREUtils.redirectStdio(false);
- JREUtils.setJavaEnvironment(this);
+ JREUtils.setJavaEnvironment(this, Tools.LAUNCH_TYPE);
JREUtils.initJavaRuntime();
JREUtils.chdir(Tools.MAIN_PATH);
diff --git a/app/src/main/java/net/kdt/pojavlaunch/JREUtils.java b/app/src/main/java/net/kdt/pojavlaunch/JREUtils.java
index d264265d5..8ddfb95ff 100644
--- a/app/src/main/java/net/kdt/pojavlaunch/JREUtils.java
+++ b/app/src/main/java/net/kdt/pojavlaunch/JREUtils.java
@@ -68,7 +68,7 @@ public class JREUtils
Log.i("jrelog-logcat","Logcat thread started");
}
- public static void setJavaEnvironment(Context ctx) throws IOException, ErrnoException {
+ public static void setJavaEnvironment(Context ctx, int launchType) throws IOException, ErrnoException {
nativeLibDir = ctx.getApplicationInfo().nativeLibraryDir;
String libName = System.getProperty("os.arch").contains("64") ? "lib64" : "lib";
String ldLibraryPath = (
@@ -85,17 +85,17 @@ public class JREUtils
Tools.homeJreDir + "/lib"
);
- setEnvironment("JAVA_HOME", Tools.homeJreDir);
- setEnvironment("HOME", Tools.MAIN_PATH);
- setEnvironment("TMPDIR", ctx.getCacheDir().getAbsolutePath());
- // setEnvironment("LIBGL_MIPMAP", "3");
- setEnvironment("MESA_GLSL_CACHE_DIR", ctx.getCacheDir().getAbsolutePath());
- setEnvironment("LD_LIBRARY_PATH", ldLibraryPath);
- setEnvironment("PATH", Tools.homeJreDir + "/bin:" + Os.getenv("PATH"));
+ setEnvironment(launchType, "JAVA_HOME", Tools.homeJreDir);
+ setEnvironment(launchType, "HOME", Tools.MAIN_PATH);
+ setEnvironment(launchType, "TMPDIR", ctx.getCacheDir().getAbsolutePath());
+ // setEnvironment(launchType, "LIBGL_MIPMAP", "3");
+ setEnvironment(launchType, "MESA_GLSL_CACHE_DIR", ctx.getCacheDir().getAbsolutePath());
+ setEnvironment(launchType, "LD_LIBRARY_PATH", ldLibraryPath);
+ setEnvironment(launchType, "PATH", Tools.homeJreDir + "/bin:" + Os.getenv("PATH"));
- setEnvironment("REGAL_GL_VENDOR", "Android");
- setEnvironment("REGAL_GL_RENDERER", "Regal");
- setEnvironment("REGAL_GL_VERSION", "4.5");
+ setEnvironment(launchType, "REGAL_GL_VENDOR", "Android");
+ setEnvironment(launchType, "REGAL_GL_RENDERER", "Regal");
+ setEnvironment(launchType, "REGAL_GL_VERSION", "4.5");
// REGAL_GL_EXTENSIONS
setLdLibraryPath(ldLibraryPath);
@@ -103,8 +103,8 @@ public class JREUtils
// return ldLibraryPath;
}
- private static void setEnvironment(String name, String value) throws ErrnoException, IOException {
- if (Tools.LAUNCH_TYPE == Tools.LTYPE_PROCESS) {
+ private static void setEnvironment(int launchType, String name, String value) throws ErrnoException, IOException {
+ if (launchType == Tools.LTYPE_PROCESS) {
Tools.mLaunchShell.writeToProcess("export " + name + "=" + value);
} else {
Os.setenv(name, value, true);
diff --git a/app/src/main/java/net/kdt/pojavlaunch/MCLauncherActivity.java b/app/src/main/java/net/kdt/pojavlaunch/MCLauncherActivity.java
index 666c4cacb..7ed9dc4bf 100644
--- a/app/src/main/java/net/kdt/pojavlaunch/MCLauncherActivity.java
+++ b/app/src/main/java/net/kdt/pojavlaunch/MCLauncherActivity.java
@@ -26,6 +26,7 @@ import org.lwjgl.glfw.*;
import android.app.AlertDialog;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
+import android.text.*;
//import android.support.v7.view.menu.*;
//import net.zhuoweizhang.boardwalk.downloader.*;
@@ -128,7 +129,7 @@ public class MCLauncherActivity extends AppCompatActivity
}
File logFile = new File(Tools.MAIN_PATH, "latestlog.txt");
- if (logFile.exists() && logFile.length() < 2048) {
+ if (logFile.exists() && logFile.length() < 20480) {
String errMsg = "Error occurred during initialization of ";
try {
String logContent = Tools.read(logFile.getAbsolutePath());
@@ -139,7 +140,7 @@ public class MCLauncherActivity extends AppCompatActivity
Tools.showError(MCLauncherActivity.this, ex);
// Do it so dialog will not shown for second time
- Tools.write(logFile.getAbsolutePath(), logContent.replace(errMsg + "VM", errMsg + " JVM"));
+ Tools.write(logFile.getAbsolutePath(), logContent.replace(errMsg + "VM", errMsg + "JVM"));
}
} catch (Throwable th) {
System.err.println("Could not detect java crash");
@@ -783,11 +784,11 @@ public class MCLauncherActivity extends AppCompatActivity
aboutB.setTitle(R.string.mcl_option_about);
try
{
- aboutB.setMessage(String.format(Tools.read(getAssets().open("about_en.txt")),
+ aboutB.setMessage(Html.fromHtml(String.format(Tools.read(getAssets().open("about_en.txt")),
Tools.APP_NAME,
Tools.usingVerName,
"3.2.3")
- );
+ ));
} catch (Exception e) {
throw new RuntimeException(e);
}
diff --git a/app/src/main/java/net/kdt/pojavlaunch/MainActivity.java b/app/src/main/java/net/kdt/pojavlaunch/MainActivity.java
index be423b8d6..5951eb5c8 100644
--- a/app/src/main/java/net/kdt/pojavlaunch/MainActivity.java
+++ b/app/src/main/java/net/kdt/pojavlaunch/MainActivity.java
@@ -23,6 +23,7 @@ import org.lwjgl.glfw.*;
import android.app.AlertDialog;
import java.lang.Process;
+import android.system.*;
public class MainActivity extends LoggableActivity implements OnTouchListener, OnClickListener
{
@@ -453,6 +454,7 @@ public class MainActivity extends LoggableActivity implements OnTouchListener, O
// TODO uncomment after fix wrong trigger
// CallbackBridge.putMouseEventWithCoords(rightOverride ? (byte) 1 : (byte) 0, (byte) 0, x, y);
+ CallbackBridge.sendCursorPos(x, y);
if (!rightOverride) {
CallbackBridge.mouseLeft = false;
}
@@ -956,18 +958,67 @@ public class MainActivity extends LoggableActivity implements OnTouchListener, O
*/
appendlnToLog("--------- beggining with launcher debug");
- File lwjgl3dir = new File(Tools.MAIN_PATH, "lwjgl3");
- if (!lwjgl3dir.exists() || lwjgl3dir.isFile()) {
- appendlnToLog("Error: LWJGL3 is not installed!");
- Tools.showError(this, new Throwable("LWJGL3 is not installed!"), true);
- return;
- } else {
- appendlnToLog("Info: LWJGL3 directory size: " + lwjgl3dir.length());
- }
+ checkLWJGL3Installed();
+ checkJavaArchitecture();
+ checkJavaArgsIsLaunchable();
JREUtils.redirectAndPrintJRELog(this);
Tools.launchMinecraft(this, mProfile, mVersionInfo);
}
+
+ private void checkJavaArchitecture() throws Exception {
+ String[] argName = Tools.currentArch.split("/");
+ String releaseContent = Tools.read(Tools.homeJreDir + "/release");
+ int osArchIndex = releaseContent.indexOf("OS_ARCH=\"") + 9;
+ releaseContent = releaseContent.substring(osArchIndex);
+ releaseContent = releaseContent.substring(0, releaseContent.indexOf("\""));
+ if (!(releaseContent.contains(argName[0]) || releaseContent.contains(argName[1]))) {
+ appendlnToLog("Architecture " + Tools.currentArch + " is incompatible with Java Runtime " + releaseContent);
+ throw new RuntimeException(getString(R.string.mcn_check_fail_incompatiblearch, Tools.currentArch, releaseContent));
+ }
+ }
+
+ private void checkJavaArgsIsLaunchable() throws Throwable {
+ appendlnToLog("Info: Custom Java arguments: \"" + LauncherPreferences.PREF_CUSTOM_JAVA_ARGS + "\"");
+
+ // Test java
+ ShellProcessOperation shell = new ShellProcessOperation(new ShellProcessOperation.OnPrintListener(){
+ @Override
+ public void onPrintLine(String text){
+ appendlnToLog("[JRETest] " + text);
+ }
+ });
+ Tools.mLaunchShell = shell;
+ JREUtils.setJavaEnvironment(this, Tools.LTYPE_PROCESS);
+ Tools.mLaunchShell = null;
+
+ List testArgs = new ArrayList();
+ testArgs.add(Tools.homeJreDir + "/bin/java");
+ Tools.getJavaArgs(this, testArgs);
+ testArgs.add("-version");
+
+ shell.writeToProcess("chmod 700 " + Tools.homeJreDir + "/bin/java");
+ shell.writeToProcess("set -e");
+ shell.writeToProcess(testArgs.toArray(new String[0]));
+
+ int exitCode = shell.waitFor();
+ appendlnToLog("Info: java test command exited with " + exitCode);
+
+ if (exitCode != 0) {
+ appendlnToLog("Error: it is failure!");
+ throw new RuntimeException(getString(R.string.mcn_check_fail_java));
+ }
+ }
+
+ private void checkLWJGL3Installed() {
+ File lwjgl3dir = new File(Tools.MAIN_PATH, "lwjgl3");
+ if (!lwjgl3dir.exists() || lwjgl3dir.isFile()) {
+ appendlnToLog("Error: LWJGL3 was not installed!");
+ throw new RuntimeException(getString(R.string.mcn_check_fail_lwjgl));
+ } else {
+ appendlnToLog("Info: LWJGL3 directory: " + lwjgl3dir.list());
+ }
+ }
public void printStream(InputStream stream) {
try {
diff --git a/app/src/main/java/net/kdt/pojavlaunch/PojavApplication.java b/app/src/main/java/net/kdt/pojavlaunch/PojavApplication.java
index 2e570a3c2..cd774b187 100644
--- a/app/src/main/java/net/kdt/pojavlaunch/PojavApplication.java
+++ b/app/src/main/java/net/kdt/pojavlaunch/PojavApplication.java
@@ -59,7 +59,14 @@ public class PojavApplication extends Application
Tools.usingVerName = thisApp.versionName;
Tools.usingVerCode = thisApp.versionCode;
Tools.datapath = getDir("files", MODE_PRIVATE).getParent();
-
+ Tools.currentArch = new File(getApplicationInfo().nativeLibraryDir).getName();
+ switch (Tools.currentArch) {
+ case "arm": Tools.currentArch = "arm/aarch32"; break;
+ case "arm64": Tools.currentArch = "arm64/aarch64"; break;
+ case "x86": Tools.currentArch = "x86/i*86"; break;
+ case "x86_64": Tools.currentArch = "x86_64/amd64"; break;
+ }
+
LauncherPreferences.DEFAULT_PREF = PreferenceManager.getDefaultSharedPreferences(this);
LauncherPreferences.loadPreferences();
diff --git a/app/src/main/java/net/kdt/pojavlaunch/PojavLoginActivity.java b/app/src/main/java/net/kdt/pojavlaunch/PojavLoginActivity.java
index 8e5e8fb3e..cb5221297 100644
--- a/app/src/main/java/net/kdt/pojavlaunch/PojavLoginActivity.java
+++ b/app/src/main/java/net/kdt/pojavlaunch/PojavLoginActivity.java
@@ -359,7 +359,7 @@ public class PojavLoginActivity extends AppCompatActivity
@Override
public void run() {
AlertDialog.Builder builder = new AlertDialog.Builder(PojavLoginActivity.this);
- builder.setTitle(getString(R.string.alerttitle_install_jre, System.getProperty("os.arch")));
+ builder.setTitle(getString(R.string.alerttitle_install_jre, Tools.currentArch));
builder.setCancelable(false);
final AlertDialog dialog = builder.create();
diff --git a/app/src/main/java/net/kdt/pojavlaunch/Tools.java b/app/src/main/java/net/kdt/pojavlaunch/Tools.java
index 6d378d0ad..f6b610266 100644
--- a/app/src/main/java/net/kdt/pojavlaunch/Tools.java
+++ b/app/src/main/java/net/kdt/pojavlaunch/Tools.java
@@ -34,7 +34,8 @@ public final class Tools
public static String mhomeUrl = "https://pojavlauncherteam.github.io/PojavLauncher"; // "http://kdtjavacraft.eu5.net";
public static String datapath = "/data/data/net.kdt.pojavlaunch";
public static String worksDir = datapath + "/app_working_dir";
-
+ public static String currentArch;
+
// New since 3.0.0
public static String homeJreDir = datapath + "/jre_runtime";
@@ -122,7 +123,7 @@ public final class Tools
// can fix java?
// setEnvironment("ORIGIN", Tools.homeJreDir + "/lib");
- JREUtils.setJavaEnvironment(ctx);
+ JREUtils.setJavaEnvironment(ctx, Tools.LAUNCH_TYPE);
if (LAUNCH_TYPE == LTYPE_PROCESS) {
mLaunchShell.writeToProcess("cd $HOME");
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 3950e2b84..5f59a0711 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -151,6 +151,9 @@
Game Crash detected! Click OK to exit.
Unable to locate crash! You may ignore this.
Are you sure want to force close?
+ LWJGL3 was not installed!
+ Architecture %s is incompatible with Java Runtime %s.
+ Could not start test Java VM. Check %s for more info.
Controls