From 75f4e4662504632b2f162ee128d5ace571286ac0 Mon Sep 17 00:00:00 2001 From: Tungstend Date: Sun, 15 Jan 2023 01:03:26 +0800 Subject: [PATCH] game launch callback --- FCL/src/main/AndroidManifest.xml | 2 + .../fcl/activity/ControllerActivity.java | 8 ++ .../tungsten/fcl/activity/JVMActivity.java | 58 ++++++-- .../fcl/activity/JVMCrashActivity.java | 12 ++ .../fcl/control/ControllerCallback.java | 16 --- .../tungsten/fcl/control/GameController.java | 47 ------- .../com/tungsten/fcl/control/GameMenu.java | 124 ++++++++++++++++++ .../fcl/control/JavaGuiController.java | 24 ---- .../com/tungsten/fcl/control/JavaGuiMenu.java | 71 ++++++++++ .../tungsten/fcl/control/MenuCallback.java | 36 +++++ .../{ControllerType.java => MenuType.java} | 2 +- .../com/tungsten/fcl/game/LauncherHelper.java | 6 +- .../com/tungsten/fcl/setting/Controllers.java | 2 +- .../fcl/ui/controller/ControllerUI.java | 5 +- ...game_controller.xml => view_game_menu.xml} | 0 .../fclcore/download/ProcessService.java | 31 ++++- .../fakefx/property/adapter/Disposer.java | 4 +- .../tungsten/fclcore/util/io/FileUtils.java | 13 ++ .../browser/FileBrowserActivity.java | 3 - .../com/tungsten/fclauncher/FCLauncher.java | 66 +++++----- .../tungsten/fclauncher/bridge/FCLBridge.java | 35 ++--- .../fclauncher/bridge/FCLBridgeCallback.java | 1 + .../fclauncher/bridge/LogReceiver.java | 5 - .../fclauncher/utils/LogFileUtil.java | 87 ------------ FCLauncher/src/main/jni/fcl/fcl_loader.c | 40 +++--- 25 files changed, 418 insertions(+), 280 deletions(-) delete mode 100644 FCL/src/main/java/com/tungsten/fcl/control/ControllerCallback.java delete mode 100644 FCL/src/main/java/com/tungsten/fcl/control/GameController.java create mode 100644 FCL/src/main/java/com/tungsten/fcl/control/GameMenu.java delete mode 100644 FCL/src/main/java/com/tungsten/fcl/control/JavaGuiController.java create mode 100644 FCL/src/main/java/com/tungsten/fcl/control/JavaGuiMenu.java create mode 100644 FCL/src/main/java/com/tungsten/fcl/control/MenuCallback.java rename FCL/src/main/java/com/tungsten/fcl/control/{ControllerType.java => MenuType.java} (62%) rename FCL/src/main/res/layout/{view_game_controller.xml => view_game_menu.xml} (100%) delete mode 100644 FCLauncher/src/main/java/com/tungsten/fclauncher/bridge/LogReceiver.java delete mode 100644 FCLauncher/src/main/java/com/tungsten/fclauncher/utils/LogFileUtil.java diff --git a/FCL/src/main/AndroidManifest.xml b/FCL/src/main/AndroidManifest.xml index 8384756b..e5fb277f 100644 --- a/FCL/src/main/AndroidManifest.xml +++ b/FCL/src/main/AndroidManifest.xml @@ -37,6 +37,8 @@ android:name="android.permission.ACCESS_FINE_LOCATION" /> + Schedulers.androidUIThread().execute(() -> { Intent intent = new Intent(context, JVMActivity.class); fclBridge.setScaleFactor(repository.getVersionSetting(selectedVersion).getScaleFactor()); - JVMActivity.setFClBridge(fclBridge, ControllerType.GAME); + fclBridge.setController(repository.getVersionSetting(selectedVersion).getController()); + JVMActivity.setFClBridge(fclBridge, MenuType.GAME); LOG.log(Level.INFO, "Start JVMActivity!"); context.startActivity(intent); })).withStage("launch.state.waiting_launching")) diff --git a/FCL/src/main/java/com/tungsten/fcl/setting/Controllers.java b/FCL/src/main/java/com/tungsten/fcl/setting/Controllers.java index b3379744..b7b33837 100644 --- a/FCL/src/main/java/com/tungsten/fcl/setting/Controllers.java +++ b/FCL/src/main/java/com/tungsten/fcl/setting/Controllers.java @@ -84,7 +84,7 @@ public class Controllers { controllers.addListener(onInvalidating(Controllers::checkControllers)); } - static void init() { + public static void init() { if (initialized) throw new IllegalStateException("Already initialized"); diff --git a/FCL/src/main/java/com/tungsten/fcl/ui/controller/ControllerUI.java b/FCL/src/main/java/com/tungsten/fcl/ui/controller/ControllerUI.java index 448d8583..e2851c8b 100644 --- a/FCL/src/main/java/com/tungsten/fcl/ui/controller/ControllerUI.java +++ b/FCL/src/main/java/com/tungsten/fcl/ui/controller/ControllerUI.java @@ -3,12 +3,14 @@ package com.tungsten.fcl.ui.controller; import static com.tungsten.fcl.util.FXUtils.onInvalidating; import android.content.Context; +import android.content.Intent; import android.view.View; import android.widget.ListView; import androidx.appcompat.widget.LinearLayoutCompat; import com.tungsten.fcl.R; +import com.tungsten.fcl.activity.ControllerActivity; import com.tungsten.fcl.setting.Controller; import com.tungsten.fcl.setting.Controllers; import com.tungsten.fclcore.fakefx.beans.binding.Bindings; @@ -158,7 +160,8 @@ public class ControllerUI extends FCLCommonUI implements View.OnClickListener { dialog.show(); } if (view == editController) { - + Intent intent = new Intent(getContext(), ControllerActivity.class); + getActivity().startActivity(intent); } } } diff --git a/FCL/src/main/res/layout/view_game_controller.xml b/FCL/src/main/res/layout/view_game_menu.xml similarity index 100% rename from FCL/src/main/res/layout/view_game_controller.xml rename to FCL/src/main/res/layout/view_game_menu.xml diff --git a/FCLCore/src/main/java/com/tungsten/fclcore/download/ProcessService.java b/FCLCore/src/main/java/com/tungsten/fclcore/download/ProcessService.java index 9af1c753..f951d6f0 100644 --- a/FCLCore/src/main/java/com/tungsten/fclcore/download/ProcessService.java +++ b/FCLCore/src/main/java/com/tungsten/fclcore/download/ProcessService.java @@ -8,13 +8,17 @@ import androidx.annotation.Nullable; import com.tungsten.fclauncher.FCLConfig; import com.tungsten.fclauncher.FCLauncher; +import com.tungsten.fclauncher.bridge.FCLBridge; import com.tungsten.fclauncher.bridge.FCLBridgeCallback; -import com.tungsten.fclauncher.utils.LogFileUtil; +import com.tungsten.fclcore.util.Logging; +import com.tungsten.fclcore.util.io.FileUtils; +import java.io.File; +import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetSocketAddress; -import java.util.concurrent.CompletableFuture; +import java.util.logging.Level; public class ProcessService extends Service { @@ -28,7 +32,6 @@ public class ProcessService extends Service { @Override public int onStartCommand(Intent intent, int flags, int startId) { - LogFileUtil.getInstance().writeLog("ProcessService started!"); String[] command = intent.getExtras().getStringArray("command"); FCLConfig config = new FCLConfig( getApplicationContext(), @@ -41,20 +44,36 @@ public class ProcessService extends Service { return super.onStartCommand(intent, flags, startId); } + private boolean firstLog = true; + public void startProcess(FCLConfig config) { + FCLBridge bridge = FCLauncher.launchAPIInstaller(config); FCLBridgeCallback callback = new FCLBridgeCallback() { @Override public void onCursorModeChange(int mode) { // Ignore } + @Override + public void onLog(String log) { + try { + if (firstLog) { + FileUtils.writeText(new File(bridge.getLogPath()), log + "\n"); + firstLog = false; + } else { + FileUtils.writeTextWithAppendMode(new File(bridge.getLogPath()), log + "\n"); + } + } catch (IOException e) { + Logging.LOG.log(Level.WARNING, "Can't log game log to target file", e.getMessage()); + } + } + @Override public void onExit(int code) { sendCode(code); } }; - CompletableFuture future = FCLauncher.launchAPIInstaller(config, callback); - future.whenComplete((integer, throwable) -> sendCode(integer)); + bridge.execute(null, callback); } private void sendCode(int code) { @@ -65,7 +84,6 @@ public class ProcessService extends Service { DatagramPacket packet = new DatagramPacket(data, data.length); socket.send(packet); socket.close(); - LogFileUtil.getInstance().writeLog("Code = " + code + ", send the code now!"); } catch (Exception e) { e.printStackTrace(); } @@ -74,7 +92,6 @@ public class ProcessService extends Service { @Override public void onDestroy() { - LogFileUtil.getInstance().writeLog("Destroy the service now!"); super.onDestroy(); android.os.Process.killProcess(android.os.Process.myPid()); } diff --git a/FCLCore/src/main/java/com/tungsten/fclcore/fakefx/property/adapter/Disposer.java b/FCLCore/src/main/java/com/tungsten/fclcore/fakefx/property/adapter/Disposer.java index 6c14bf55..8e35a10c 100644 --- a/FCLCore/src/main/java/com/tungsten/fclcore/fakefx/property/adapter/Disposer.java +++ b/FCLCore/src/main/java/com/tungsten/fclcore/fakefx/property/adapter/Disposer.java @@ -1,7 +1,5 @@ package com.tungsten.fclcore.fakefx.property.adapter; -import com.tungsten.fclauncher.utils.LogFileUtil; - import java.lang.ref.PhantomReference; import java.lang.ref.Reference; import java.lang.ref.ReferenceQueue; @@ -46,7 +44,7 @@ public class Disposer implements Runnable { Runnable rec = (Runnable)records.remove(obj); rec.run(); } catch (Exception e) { - LogFileUtil.getInstance().writeLog("Exception while removing reference: " + e); + System.out.println("Exception while removing reference: " + e); e.printStackTrace(); } } diff --git a/FCLCore/src/main/java/com/tungsten/fclcore/util/io/FileUtils.java b/FCLCore/src/main/java/com/tungsten/fclcore/util/io/FileUtils.java index e96a646a..e1852d3f 100644 --- a/FCLCore/src/main/java/com/tungsten/fclcore/util/io/FileUtils.java +++ b/FCLCore/src/main/java/com/tungsten/fclcore/util/io/FileUtils.java @@ -106,6 +106,19 @@ public final class FileUtils { return new String(Files.readAllBytes(file), charset); } + public static void writeTextWithAppendMode(File file, String text) throws IOException { + writeBytesWithAppendMode(file.toPath(), text.getBytes(UTF_8)); + } + + public static void writeTextWithAppendMode(Path file, String text) throws IOException { + writeBytesWithAppendMode(file, text.getBytes(UTF_8)); + } + + public static void writeBytesWithAppendMode(Path file, byte[] data) throws IOException { + Files.createDirectories(file.getParent()); + Files.write(file, data, StandardOpenOption.CREATE, StandardOpenOption.APPEND); + } + /** * Write plain text to file. Characters are encoded into bytes using UTF-8. *

diff --git a/FCLLibrary/src/main/java/com/tungsten/fcllibrary/browser/FileBrowserActivity.java b/FCLLibrary/src/main/java/com/tungsten/fcllibrary/browser/FileBrowserActivity.java index 2280f7b1..243ed60e 100644 --- a/FCLLibrary/src/main/java/com/tungsten/fcllibrary/browser/FileBrowserActivity.java +++ b/FCLLibrary/src/main/java/com/tungsten/fcllibrary/browser/FileBrowserActivity.java @@ -12,7 +12,6 @@ import android.widget.Toast; import androidx.annotation.Nullable; -import com.tungsten.fclauncher.utils.LogFileUtil; import com.tungsten.fcllibrary.R; import com.tungsten.fcllibrary.browser.adapter.FileBrowserAdapter; import com.tungsten.fcllibrary.browser.adapter.FileBrowserListener; @@ -127,11 +126,9 @@ public class FileBrowserActivity extends FCLActivity implements View.OnClickList } adapter1.setSelectedFiles(selectedFiles); adapter1.notifyDataSetChanged(); - LogFileUtil.getInstance().writeLog(selectedFiles); } }); listView.setAdapter(adapter); - LogFileUtil.getInstance().writeLog(selectedFiles); } @Override diff --git a/FCLauncher/src/main/java/com/tungsten/fclauncher/FCLauncher.java b/FCLauncher/src/main/java/com/tungsten/fclauncher/FCLauncher.java index b3b087e2..3ecae8a4 100644 --- a/FCLauncher/src/main/java/com/tungsten/fclauncher/FCLauncher.java +++ b/FCLauncher/src/main/java/com/tungsten/fclauncher/FCLauncher.java @@ -8,9 +8,7 @@ import android.util.ArrayMap; import com.jaredrummler.android.device.DeviceName; import com.tungsten.fclauncher.bridge.FCLBridge; -import com.tungsten.fclauncher.bridge.FCLBridgeCallback; import com.tungsten.fclauncher.utils.Architecture; -import com.tungsten.fclauncher.utils.LogFileUtil; import java.io.BufferedReader; import java.io.File; @@ -20,23 +18,21 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.Map; -import java.util.concurrent.CompletableFuture; public class FCLauncher { // Todo : don't crash when launch 1.17+ with OpenGL 2.1 // Todo : mouse scroll event - // Todo : custom logger // Todo : mesa - private static void printTaskTitle(String task) { - LogFileUtil.getInstance().writeLog("==================== " + task + " ===================="); + private static void printTaskTitle(FCLBridge bridge, String task) { + bridge.getCallback().onLog("==================== " + task + " ===================="); } - private static void logStartInfo(String task) { - printTaskTitle("Start " + task); - LogFileUtil.getInstance().writeLog("Device: " + DeviceName.getDeviceName()); - LogFileUtil.getInstance().writeLog("Architecture: " + Architecture.archAsString(Architecture.getDeviceArchitecture())); + private static void logStartInfo(FCLBridge bridge, String task) { + printTaskTitle(bridge, "Start " + task); + bridge.getCallback().onLog("Device: " + DeviceName.getDeviceName()); + bridge.getCallback().onLog("Architecture: " + Architecture.archAsString(Architecture.getDeviceArchitecture())); } private static Map readJREReleaseProperties(String javaPath) throws IOException { @@ -166,12 +162,12 @@ public class FCLauncher { if (render) { addRendererEnv(config, envMap); } - printTaskTitle("Env Map"); + printTaskTitle(bridge, "Env Map"); for (String key : envMap.keySet()) { - LogFileUtil.getInstance().writeLog("Env: " + key + "=" + envMap.get(key)); + bridge.getCallback().onLog("Env: " + key + "=" + envMap.get(key)); bridge.setenv(key, envMap.get(key)); } - printTaskTitle("Env Map"); + printTaskTitle(bridge, "Env Map"); } private static void setUpJavaRuntime(FCLConfig config, FCLBridge bridge) throws IOException { @@ -228,27 +224,27 @@ public class FCLauncher { } private static int launch(FCLConfig config, FCLBridge bridge, String task) throws IOException { - printTaskTitle(task + " Arguments"); + printTaskTitle(bridge, task + " Arguments"); String[] args = rebaseArgs(config); for (String arg : args) { - LogFileUtil.getInstance().writeLog(task + " argument: " + arg); + bridge.getCallback().onLog(task + " argument: " + arg); } bridge.setupJLI(); bridge.setLdLibraryPath(getLibraryPath(config.getContext(), config.getJavaPath())); - LogFileUtil.getInstance().writeLog("Hook exit " + (bridge.setupExitTrap(bridge) == 0 ? "success" : "failed")); + bridge.getCallback().onLog("Hook exit " + (bridge.setupExitTrap(bridge) == 0 ? "success" : "failed")); int exitCode = bridge.jliLaunch(args); - LogFileUtil.getInstance().writeLog("OpenJDK exited with code : " + exitCode); + bridge.getCallback().onLog("OpenJDK exited with code : " + exitCode); return exitCode; } public static FCLBridge launchMinecraft(FCLConfig config) { // initialize FCLBridge - FCLBridge bridge = new FCLBridge(null); + FCLBridge bridge = new FCLBridge(); bridge.setLogPath(config.getLogDir() + "/latest_game.log"); Thread gameThread = new Thread(() -> { try { - logStartInfo("Minecraft"); + logStartInfo(bridge, "Minecraft"); // env setEnv(config, bridge, true); @@ -260,11 +256,12 @@ public class FCLauncher { setupGraphicAndSoundEngine(config, bridge); // set working directory - LogFileUtil.getInstance().writeLog("Working directory: " + config.getWorkingDir()); + bridge.getCallback().onLog("Working directory: " + config.getWorkingDir()); bridge.chdir(config.getWorkingDir()); // launch game - launch(config, bridge, "Minecraft"); + int code = launch(config, bridge, "Minecraft"); + bridge.onExit(code); } catch (IOException e) { e.printStackTrace(); } @@ -279,12 +276,12 @@ public class FCLauncher { public static FCLBridge launchJavaGUI(FCLConfig config) { // initialize FCLBridge - FCLBridge bridge = new FCLBridge(null); + FCLBridge bridge = new FCLBridge(); bridge.setLogPath(config.getLogDir() + "/latest_java_gui.log"); Thread javaGUIThread = new Thread(() -> { try { - logStartInfo("Java GUI"); + logStartInfo(bridge, "Java GUI"); // env setEnv(config, bridge, true); @@ -296,11 +293,12 @@ public class FCLauncher { setupGraphicAndSoundEngine(config, bridge); // set working directory - LogFileUtil.getInstance().writeLog("Working directory: " + config.getWorkingDir()); + bridge.getCallback().onLog("Working directory: " + config.getWorkingDir()); bridge.chdir(config.getWorkingDir()); // launch java gui - launch(config, bridge, "Java GUI"); + int code = launch(config, bridge, "Java GUI"); + bridge.onExit(code); } catch (IOException e) { e.printStackTrace(); } @@ -311,17 +309,15 @@ public class FCLauncher { return bridge; } - public static CompletableFuture launchAPIInstaller(FCLConfig config, FCLBridgeCallback callback) { + public static FCLBridge launchAPIInstaller(FCLConfig config) { // initialize FCLBridge - FCLBridge bridge = new FCLBridge(callback); + FCLBridge bridge = new FCLBridge(); bridge.setLogPath(config.getLogDir() + "/latest_api_installer.log"); - CompletableFuture future = new CompletableFuture<>(); - Thread apiInstallerThread = new Thread(() -> { try { - logStartInfo("API Installer"); + logStartInfo(bridge, "API Installer"); // env setEnv(config, bridge, false); @@ -330,18 +326,20 @@ public class FCLauncher { setUpJavaRuntime(config, bridge); // set working directory - LogFileUtil.getInstance().writeLog("Working directory: " + config.getWorkingDir()); + bridge.getCallback().onLog("Working directory: " + config.getWorkingDir()); bridge.chdir(config.getWorkingDir()); // launch api installer - future.complete(launch(config, bridge, "API Installer")); + int code = launch(config, bridge, "API Installer"); + bridge.onExit(code); } catch (IOException e) { e.printStackTrace(); } }); - apiInstallerThread.start(); - return future; + bridge.setThread(apiInstallerThread); + + return bridge; } } diff --git a/FCLauncher/src/main/java/com/tungsten/fclauncher/bridge/FCLBridge.java b/FCLauncher/src/main/java/com/tungsten/fclauncher/bridge/FCLBridge.java index 5bbec1e1..7aed1eaf 100644 --- a/FCLauncher/src/main/java/com/tungsten/fclauncher/bridge/FCLBridge.java +++ b/FCLauncher/src/main/java/com/tungsten/fclauncher/bridge/FCLBridge.java @@ -5,11 +5,11 @@ import android.content.ClipboardManager; import android.content.Context; import android.view.Surface; +import androidx.annotation.NonNull; + import com.tungsten.fclauncher.FCLPath; -import com.tungsten.fclauncher.utils.LogFileUtil; import java.io.Serializable; -import java.lang.ref.WeakReference; public class FCLBridge implements Serializable { @@ -43,14 +43,14 @@ public class FCLBridge implements Serializable { public static final int CloseRequest = 0; - public FCLBridgeCallback callback; + private FCLBridgeCallback callback; private double scaleFactor = 1f; + private String controller = "Default"; private String logPath; private Thread thread; private Thread fclLogThread; private boolean isLogPipeReady = false; - private WeakReference logReceiver; static { System.loadLibrary("xhook"); @@ -58,10 +58,7 @@ public class FCLBridge implements Serializable { System.loadLibrary("glfw"); } - public static int cursorMode = CursorEnabled; - - public FCLBridge(FCLBridgeCallback callback) { - this.callback = callback; + public FCLBridge() { } public native void setFCLNativeWindow(Surface surface); @@ -86,11 +83,13 @@ public class FCLBridge implements Serializable { return thread; } + public FCLBridgeCallback getCallback() { + return callback; + } + public void execute(Surface surface, FCLBridgeCallback callback) { this.callback = callback; - LogFileUtil logFileUtil = LogFileUtil.getInstance(); - logFileUtil.setLogFilePath(getLogPath()); fclLogThread = new Thread(() -> redirectStdio(getLogPath())); fclLogThread.setName("FCLLogThread"); fclLogThread.start(); @@ -139,7 +138,6 @@ public class FCLBridge implements Serializable { // FCLBridge callbacks public void setCursorMode(int mode) { - cursorMode = mode; if (callback != null) { callback.onCursorModeChange(mode); } @@ -168,6 +166,15 @@ public class FCLBridge implements Serializable { return scaleFactor; } + public void setController(String controller) { + this.controller = controller; + } + + public String getController() { + return controller; + } + + @NonNull public String getLogPath() { return logPath; } @@ -181,10 +188,8 @@ public class FCLBridge implements Serializable { } public void receiveLog(String log) { - if (logReceiver == null || logReceiver.get() == null) { - logReceiver = new WeakReference<>(log1 -> LogFileUtil.getInstance().writeLog(log1)); - } else { - logReceiver.get().pushLog(log); + if (callback != null) { + callback.onLog(log); } } } diff --git a/FCLauncher/src/main/java/com/tungsten/fclauncher/bridge/FCLBridgeCallback.java b/FCLauncher/src/main/java/com/tungsten/fclauncher/bridge/FCLBridgeCallback.java index eff39d58..c33ae90d 100644 --- a/FCLauncher/src/main/java/com/tungsten/fclauncher/bridge/FCLBridgeCallback.java +++ b/FCLauncher/src/main/java/com/tungsten/fclauncher/bridge/FCLBridgeCallback.java @@ -3,6 +3,7 @@ package com.tungsten.fclauncher.bridge; public interface FCLBridgeCallback { void onCursorModeChange(int mode); + void onLog(String log); void onExit(int code); } diff --git a/FCLauncher/src/main/java/com/tungsten/fclauncher/bridge/LogReceiver.java b/FCLauncher/src/main/java/com/tungsten/fclauncher/bridge/LogReceiver.java deleted file mode 100644 index 39e5f748..00000000 --- a/FCLauncher/src/main/java/com/tungsten/fclauncher/bridge/LogReceiver.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.tungsten.fclauncher.bridge; - -public interface LogReceiver { - void pushLog(String log); -} diff --git a/FCLauncher/src/main/java/com/tungsten/fclauncher/utils/LogFileUtil.java b/FCLauncher/src/main/java/com/tungsten/fclauncher/utils/LogFileUtil.java deleted file mode 100644 index 62950d5e..00000000 --- a/FCLauncher/src/main/java/com/tungsten/fclauncher/utils/LogFileUtil.java +++ /dev/null @@ -1,87 +0,0 @@ -package com.tungsten.fclauncher.utils; - -import android.util.Log; - -import com.tungsten.fclauncher.FCLPath; - -import java.io.File; -import java.io.FileOutputStream; -import java.io.FileWriter; -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; - -/** - * @author mio - */ -public class LogFileUtil { - - private static final LogFileUtil INSTANCE = new LogFileUtil(); - private String logFilePath; - private boolean firstWrite = true; - private boolean isWrite = true; - - protected LogFileUtil() { - - } - - public static LogFileUtil getInstance(){ - return INSTANCE; - } - - public void setLogFilePath(String logFilePath){ - this.logFilePath = logFilePath; - } - - public void writeLog(String log) { - Log.e("FCL", log); - if (this.logFilePath == null) { - this.logFilePath = FCLPath.SHARED_COMMON_DIR + "/latest.log"; - } - log += "\n"; - if (!isWrite) { - return; - } - File logFile = new File(this.logFilePath); - if (!logFile.exists()) { - try { - if (!logFile.createNewFile()) { - isWrite = false; - } - } catch (IOException e) { - e.printStackTrace(); - } - } - if (firstWrite) { - writeData(logFile.getAbsolutePath(), log); - firstWrite = false; - } else { - addStringLineToFile(log, logFile); - } - } - - public void writeLog(ArrayList arrayList) { - for (String s:arrayList) { - writeLog(s); - } - } - - public static void writeData(String path, String fileData) { - File file = new File(path); - try (FileOutputStream out = new FileOutputStream(file, false)) { - out.write(fileData.getBytes(StandardCharsets.UTF_8)); - } catch (Exception e) { - e.printStackTrace(); - } - } - - public static boolean addStringLineToFile(String content, File file) { - try (FileWriter fw = new FileWriter(file, true)) { - fw.write(content); - return true; - } catch (IOException e) { - e.printStackTrace(); - return false; - } - } -} diff --git a/FCLauncher/src/main/jni/fcl/fcl_loader.c b/FCLauncher/src/main/jni/fcl/fcl_loader.c index c2c991f3..0779dd2b 100644 --- a/FCLauncher/src/main/jni/fcl/fcl_loader.c +++ b/FCLauncher/src/main/jni/fcl/fcl_loader.c @@ -41,35 +41,33 @@ jstring CStr2Jstring(JNIEnv *env, char *buffer) { return (jstring) (*env)->NewObject(env, strClass, ctorID, bytes, encoding); } -JNIEXPORT void JNICALL Java_com_tungsten_fclauncher_bridge_FCLBridge_redirectStdio(JNIEnv* env, jclass clazz, - jstring path){ +JNIEXPORT void JNICALL Java_com_tungsten_fclauncher_bridge_FCLBridge_redirectStdio(JNIEnv* env, jclass clazz, jstring path) { int fclFd[2]; - if (pipe(fclFd) < 0){ + if (pipe(fclFd) < 0) { __android_log_print(ANDROID_LOG_ERROR, "FCL", "Failed to create log pipe!"); } - if(dup2(fclFd[1], STDOUT_FILENO) != STDOUT_FILENO && dup2(fclFd[1], STDERR_FILENO) != STDERR_FILENO){ + if (dup2(fclFd[1], STDOUT_FILENO) != STDOUT_FILENO && dup2(fclFd[1], STDERR_FILENO) != STDERR_FILENO) { __android_log_print(ANDROID_LOG_ERROR, "FCL", "failed to redirect stdio !"); } char buffer[1024]; - jclass birdge = (*env) -> FindClass(env, "com/tungsten/fclauncher/bridge/FCLBridge"); - jmethodID method_setLogPipeReady = (*env) ->GetMethodID(env, birdge,"setLogPipeReady", "()V"); - if(!method_setLogPipeReady){ - __android_log_print(ANDROID_LOG_ERROR, "FCL", "Failed to find setLogPipeReady method !"); + jclass bridge = (*env) -> FindClass(env, "com/tungsten/fclauncher/bridge/FCLBridge"); + jmethodID method_setLogPipeReady = (*env) -> GetMethodID(env, bridge,"setLogPipeReady", "()V"); + if (!method_setLogPipeReady) { + __android_log_print(ANDROID_LOG_ERROR, "FCL", "Failed to find setLogPipeReady method!"); } - fcl.logFile=fdopen(fclFd[1],"a"); + fcl.logFile = fdopen(fclFd[1],"a"); FCL_INTERNAL_LOG("Log pipe ready."); - (*env)->CallVoidMethod(env,clazz,method_setLogPipeReady); - jmethodID method_receiveLog = (*env) ->GetMethodID(env, birdge,"receiveLog", - "(Ljava/lang/String;)V"); - if(!method_receiveLog){ - __android_log_print(ANDROID_LOG_ERROR, "FCL", "Failed to find receive method !"); + (*env) -> CallVoidMethod(env,clazz,method_setLogPipeReady); + jmethodID method_receiveLog = (*env) -> GetMethodID(env, bridge, "receiveLog", "(Ljava/lang/String;)V"); + if (!method_receiveLog) { + __android_log_print(ANDROID_LOG_ERROR, "FCL", "Failed to find receive method!"); } - while (1){ + while (1) { memset(buffer, '\0', sizeof(buffer)); ssize_t _s = read(fclFd[0], buffer, sizeof(buffer) - 1); - if (_s < 0){ + if (_s < 0) { __android_log_print(ANDROID_LOG_ERROR, "FCL", "Failed to read log !"); close(fclFd[0]); close(fclFd[1]); @@ -77,7 +75,7 @@ JNIEXPORT void JNICALL Java_com_tungsten_fclauncher_bridge_FCLBridge_redirectStd } else { buffer[_s] = '\0'; } - if(buffer[0] == '\0') + if (buffer[0] == '\0') continue; else { (*env)->CallVoidMethod(env, clazz, method_receiveLog, CStr2Jstring(env, buffer)); @@ -114,7 +112,9 @@ JNIEXPORT jint JNICALL Java_com_tungsten_fclauncher_bridge_FCLBridge_dlopen(JNIE void* handle; dlerror(); handle = dlopen(lib_name, RTLD_GLOBAL | RTLD_LAZY); - __android_log_print(dlerror() == NULL ? ANDROID_LOG_INFO : ANDROID_LOG_ERROR, "FCL", "loading %s (error = %s)", lib_name, dlerror()); + + char * error = dlerror(); + __android_log_print(error == NULL ? ANDROID_LOG_INFO : ANDROID_LOG_ERROR, "FCL", "loading %s (error = %s)", lib_name, error); if (handle == NULL) { ret = -1; @@ -130,7 +130,8 @@ JNIEXPORT void JNICALL Java_com_tungsten_fclauncher_bridge_FCLBridge_setLdLibrar void *updateLdLibPath = dlsym(libdl_handle, "android_update_LD_LIBRARY_PATH"); if (updateLdLibPath == NULL) { updateLdLibPath = dlsym(libdl_handle, "__loader_android_update_LD_LIBRARY_PATH"); - __android_log_print(dlerror() == NULL ? ANDROID_LOG_INFO : ANDROID_LOG_ERROR, "FCL", "loading %s (error = %s)", "libdl.so", dlerror()); + char * error = dlerror(); + __android_log_print(error == NULL ? ANDROID_LOG_INFO : ANDROID_LOG_ERROR, "FCL", "loading %s (error = %s)", "libdl.so", error); } android_update_LD_LIBRARY_PATH = (android_update_LD_LIBRARY_PATH_t) updateLdLibPath; const char* ldLibPathUtf = (*env)->GetStringUTFChars(env, ldLibraryPath, 0); @@ -155,6 +156,7 @@ JNIEXPORT jint JNICALL Java_com_tungsten_fclauncher_bridge_FCLBridge_setupExitTr jclass exitTrap_exitClass = (*env)->NewGlobalRef(env,(*env)->FindClass(env, "com/tungsten/fclauncher/bridge/FCLBridge")); exitTrap_method = (*env)->GetMethodID(env, exitTrap_exitClass, "onExit", "(I)V"); (*env)->DeleteGlobalRef(env, exitTrap_exitClass); + // Enable xhook debug mode here // xhook_enable_debug(1); xhook_register(".*\\.so$", "exit", custom_exit, (void **) &old_exit); return xhook_refresh(1);