From 4d9011a8f0f7b64de23a27babffb533ebeb2075b Mon Sep 17 00:00:00 2001 From: Charles Lombardo Date: Sun, 2 Apr 2023 23:46:22 -0400 Subject: [PATCH] android: Convert NativeLibrary to Kotlin --- .../java/org/yuzu/yuzu_emu/NativeLibrary.java | 698 ------------------ .../java/org/yuzu/yuzu_emu/NativeLibrary.kt | 463 ++++++++++++ .../java/org/yuzu/yuzu_emu/YuzuApplication.kt | 2 +- .../yuzu_emu/activities/EmulationActivity.kt | 7 +- .../org/yuzu/yuzu_emu/adapters/GameAdapter.kt | 2 +- .../applets/keyboard/SoftwareKeyboard.kt | 2 +- .../features/settings/ui/SettingsActivity.kt | 2 +- .../settings/ui/SettingsActivityPresenter.kt | 2 +- .../features/settings/utils/SettingsFile.kt | 2 +- .../yuzu_emu/fragments/EmulationFragment.kt | 20 +- .../org/yuzu/yuzu_emu/ui/main/MainActivity.kt | 6 +- .../yuzu_emu/utils/DirectoryInitialization.kt | 4 +- .../org/yuzu/yuzu_emu/utils/GameHelper.kt | 12 +- .../yuzu/yuzu_emu/utils/GpuDriverHelper.kt | 2 +- src/android/app/src/main/jni/native.cpp | 65 +- 15 files changed, 523 insertions(+), 766 deletions(-) delete mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/NativeLibrary.java create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/NativeLibrary.kt diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/NativeLibrary.java b/src/android/app/src/main/java/org/yuzu/yuzu_emu/NativeLibrary.java deleted file mode 100644 index 50ec34e22..000000000 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/NativeLibrary.java +++ /dev/null @@ -1,698 +0,0 @@ -/* - * Copyright 2013 Dolphin Emulator Project - * Licensed under GPLv2+ - * Refer to the license.txt file included. - */ - -package org.yuzu.yuzu_emu; - -import android.app.Activity; -import android.app.Dialog; -import android.content.pm.PackageManager; -import android.content.res.Configuration; -import android.os.Bundle; -import android.text.Html; -import android.text.method.LinkMovementMethod; -import android.view.Surface; -import android.view.ViewGroup; -import android.widget.EditText; -import android.widget.FrameLayout; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.appcompat.app.AlertDialog; -import androidx.core.content.ContextCompat; -import androidx.fragment.app.DialogFragment; - -import com.google.android.material.dialog.MaterialAlertDialogBuilder; - -import org.yuzu.yuzu_emu.activities.EmulationActivity; -import org.yuzu.yuzu_emu.utils.DocumentsTree; -import org.yuzu.yuzu_emu.utils.EmulationMenuSettings; -import org.yuzu.yuzu_emu.utils.FileUtil; -import org.yuzu.yuzu_emu.utils.Log; - -import java.lang.ref.WeakReference; -import java.util.Objects; - -import static android.Manifest.permission.CAMERA; -import static android.Manifest.permission.RECORD_AUDIO; - -/** - * Class which contains methods that interact - * with the native side of the Citra code. - */ -public final class NativeLibrary { - /** - * Default controller id for each device - */ - public static final int Player1Device = 0; - public static final int Player2Device = 1; - public static final int Player3Device = 2; - public static final int Player4Device = 3; - public static final int Player5Device = 4; - public static final int Player6Device = 5; - public static final int Player7Device = 6; - public static final int Player8Device = 7; - public static final int ConsoleDevice = 8; - public static WeakReference sEmulationActivity = new WeakReference<>(null); - - private static boolean alertResult = false; - private static String alertPromptResult = ""; - private static int alertPromptButton = 0; - private static final Object alertPromptLock = new Object(); - private static boolean alertPromptInProgress = false; - private static String alertPromptCaption = ""; - private static int alertPromptButtonConfig = 0; - private static EditText alertPromptEditText = null; - - static { - try { - System.loadLibrary("yuzu-android"); - } catch (UnsatisfiedLinkError ex) { - Log.error("[NativeLibrary] " + ex.toString()); - } - } - - private NativeLibrary() { - // Disallows instantiation. - } - - public static int openContentUri(String path, String openmode) { - if (DocumentsTree.isNativePath(path)) { - return YuzuApplication.documentsTree.openContentUri(path, openmode); - } - return FileUtil.openContentUri(YuzuApplication.getAppContext(), path, openmode); - } - - public static long getSize(String path) { - if (DocumentsTree.isNativePath(path)) { - return YuzuApplication.documentsTree.getFileSize(path); - } - return FileUtil.getFileSize(YuzuApplication.getAppContext(), path); - } - - /** - * Handles button press events for a gamepad. - * - * @param Device The input descriptor of the gamepad. - * @param Button Key code identifying which button was pressed. - * @param Action Mask identifying which action is happening (button pressed down, or button released). - * @return If we handled the button press. - */ - public static native boolean onGamePadButtonEvent(int Device, int Button, int Action); - - /** - * Handles joystick movement events. - * - * @param Device The device ID of the gamepad. - * @param Axis The axis ID - * @param x_axis The value of the x-axis represented by the given ID. - * @param y_axis The value of the y-axis represented by the given ID. - */ - public static native boolean onGamePadJoystickEvent(int Device, int Axis, float x_axis, float y_axis); - - /** - * Handles motion events. - * - * @param delta_timestamp The finger id corresponding to this event - * @param gyro_x,gyro_y,gyro_z The value of the accelerometer sensor. - * @param accel_x,accel_y,accel_z The value of the y-axis - */ - - public static native boolean onGamePadMotionEvent(int Device, long delta_timestamp, float gyro_x, float gyro_y, - float gyro_z, float accel_x, float accel_y, float accel_z); - - /** - * Signals and load a nfc tag - * - * @param data Byte array containing all the data from a nfc tag - */ - public static native boolean onReadNfcTag(byte[] data); - - /** - * Removes current loaded nfc tag - */ - public static native boolean onRemoveNfcTag(); - - /** - * Handles touch press events. - * - * @param finger_id The finger id corresponding to this event - * @param x_axis The value of the x-axis. - * @param y_axis The value of the y-axis. - */ - public static native void onTouchPressed(int finger_id, float x_axis, float y_axis); - - /** - * Handles touch movement. - * - * @param x_axis The value of the instantaneous x-axis. - * @param y_axis The value of the instantaneous y-axis. - */ - public static native void onTouchMoved(int finger_id, float x_axis, float y_axis); - - /** - * Handles touch release events. - * - * @param finger_id The finger id corresponding to this event - */ - public static native void onTouchReleased(int finger_id); - - public static native void ReloadSettings(); - - public static native String GetUserSetting(String gameID, String Section, String Key); - - public static native void SetUserSetting(String gameID, String Section, String Key, String Value); - - public static native void InitGameIni(String gameID); - - /** - * Gets the embedded icon within the given ROM. - * - * @param filename the file path to the ROM. - * @return a byte array containing the JPEG data for the icon. - */ - public static native byte[] GetIcon(String filename); - - /** - * Gets the embedded title of the given ISO/ROM. - * - * @param filename The file path to the ISO/ROM. - * @return the embedded title of the ISO/ROM. - */ - public static native String GetTitle(String filename); - - public static native String GetDescription(String filename); - - public static native String GetGameId(String filename); - - public static native String GetRegions(String filename); - - public static native String GetCompany(String filename); - - public static native String GetGitRevision(); - - public static native void SetAppDirectory(String directory); - - public static native void InitializeGpuDriver(String hookLibDir, String customDriverDir, String customDriverName, String fileRedirectDir); - - public static native boolean ReloadKeys(); - - public static native void InitializeEmulation(); - - public static native int DefaultCPUCore(); - - /** - * Begins emulation. - */ - public static native void Run(String path); - - /** - * Begins emulation from the specified savestate. - */ - public static native void Run(String path, String savestatePath, boolean deleteSavestate); - - // Surface Handling - public static native void SurfaceChanged(Surface surf); - - public static native void SurfaceDestroyed(); - - /** - * Unpauses emulation from a paused state. - */ - public static native void UnPauseEmulation(); - - /** - * Pauses emulation. - */ - public static native void PauseEmulation(); - - /** - * Stops emulation. - */ - public static native void StopEmulation(); - - /** - * Resets the in-memory ROM metadata cache. - */ - public static native void ResetRomMetadata(); - - /** - * Returns true if emulation is running (or is paused). - */ - public static native boolean IsRunning(); - - /** - * Returns the performance stats for the current game - **/ - public static native double[] GetPerfStats(); - - /** - * Notifies the core emulation that the orientation has changed. - */ - public static native void NotifyOrientationChange(int layout_option, int rotation); - - public enum CoreError { - ErrorSystemFiles, - ErrorSavestate, - ErrorUnknown, - } - - private static boolean coreErrorAlertResult = false; - private static final Object coreErrorAlertLock = new Object(); - - public static class CoreErrorDialogFragment extends DialogFragment { - static CoreErrorDialogFragment newInstance(String title, String message) { - CoreErrorDialogFragment frag = new CoreErrorDialogFragment(); - Bundle args = new Bundle(); - args.putString("title", title); - args.putString("message", message); - frag.setArguments(args); - return frag; - } - - @NonNull - @Override - public Dialog onCreateDialog(Bundle savedInstanceState) { - final Activity emulationActivity = Objects.requireNonNull(getActivity()); - - final String title = Objects.requireNonNull(Objects.requireNonNull(getArguments()).getString("title")); - final String message = Objects.requireNonNull(Objects.requireNonNull(getArguments()).getString("message")); - - return new MaterialAlertDialogBuilder(emulationActivity) - .setTitle(title) - .setMessage(message) - .setPositiveButton(R.string.continue_button, (dialog, which) -> { - coreErrorAlertResult = true; - synchronized (coreErrorAlertLock) { - coreErrorAlertLock.notify(); - } - }) - .setNegativeButton(R.string.abort_button, (dialog, which) -> { - coreErrorAlertResult = false; - synchronized (coreErrorAlertLock) { - coreErrorAlertLock.notify(); - } - }).setOnDismissListener(dialog -> { - coreErrorAlertResult = true; - synchronized (coreErrorAlertLock) { - coreErrorAlertLock.notify(); - } - }).create(); - } - } - - private static void OnCoreErrorImpl(String title, String message) { - final EmulationActivity emulationActivity = sEmulationActivity.get(); - if (emulationActivity == null) { - Log.error("[NativeLibrary] EmulationActivity not present"); - return; - } - - CoreErrorDialogFragment fragment = CoreErrorDialogFragment.newInstance(title, message); - fragment.show(emulationActivity.getSupportFragmentManager(), "coreError"); - } - - /** - * Handles a core error. - * - * @return true: continue; false: abort - */ - public static boolean OnCoreError(CoreError error, String details) { - final EmulationActivity emulationActivity = sEmulationActivity.get(); - if (emulationActivity == null) { - Log.error("[NativeLibrary] EmulationActivity not present"); - return false; - } - - String title, message; - switch (error) { - case ErrorSystemFiles: { - title = emulationActivity.getString(R.string.system_archive_not_found); - message = emulationActivity.getString(R.string.system_archive_not_found_message, details.isEmpty() ? emulationActivity.getString(R.string.system_archive_general) : details); - break; - } - case ErrorSavestate: { - title = emulationActivity.getString(R.string.save_load_error); - message = details; - break; - } - case ErrorUnknown: { - title = emulationActivity.getString(R.string.fatal_error); - message = emulationActivity.getString(R.string.fatal_error_message); - break; - } - default: { - return true; - } - } - - // Show the AlertDialog on the main thread. - emulationActivity.runOnUiThread(() -> OnCoreErrorImpl(title, message)); - - // Wait for the lock to notify that it is complete. - synchronized (coreErrorAlertLock) { - try { - coreErrorAlertLock.wait(); - } catch (Exception ignored) { - } - } - - return coreErrorAlertResult; - } - - public static boolean isPortraitMode() { - return YuzuApplication.getAppContext().getResources().getConfiguration().orientation == - Configuration.ORIENTATION_PORTRAIT; - } - - public static int landscapeScreenLayout() { - return EmulationMenuSettings.getLandscapeScreenLayout(); - } - - public static boolean displayAlertMsg(final String caption, final String text, - final boolean yesNo) { - Log.error("[NativeLibrary] Alert: " + text); - final EmulationActivity emulationActivity = sEmulationActivity.get(); - boolean result = false; - if (emulationActivity == null) { - Log.warning("[NativeLibrary] EmulationActivity is null, can't do panic alert."); - } else { - // Create object used for waiting. - final Object lock = new Object(); - MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(emulationActivity) - .setTitle(caption) - .setMessage(text); - - // If not yes/no dialog just have one button that dismisses modal, - // otherwise have a yes and no button that sets alertResult accordingly. - if (!yesNo) { - builder - .setCancelable(false) - .setPositiveButton(android.R.string.ok, (dialog, whichButton) -> - { - dialog.dismiss(); - synchronized (lock) { - lock.notify(); - } - }); - } else { - alertResult = false; - - builder - .setPositiveButton(android.R.string.yes, (dialog, whichButton) -> - { - alertResult = true; - dialog.dismiss(); - synchronized (lock) { - lock.notify(); - } - }) - .setNegativeButton(android.R.string.no, (dialog, whichButton) -> - { - alertResult = false; - dialog.dismiss(); - synchronized (lock) { - lock.notify(); - } - }); - } - - // Show the AlertDialog on the main thread. - emulationActivity.runOnUiThread(builder::show); - - // Wait for the lock to notify that it is complete. - synchronized (lock) { - try { - lock.wait(); - } catch (Exception e) { - } - } - - if (yesNo) - result = alertResult; - } - return result; - } - - public static void retryDisplayAlertPrompt() { - if (!alertPromptInProgress) { - return; - } - displayAlertPromptImpl(alertPromptCaption, alertPromptEditText.getText().toString(), alertPromptButtonConfig).show(); - } - - public static String displayAlertPrompt(String caption, String text, int buttonConfig) { - alertPromptCaption = caption; - alertPromptButtonConfig = buttonConfig; - alertPromptInProgress = true; - - // Show the AlertDialog on the main thread - sEmulationActivity.get().runOnUiThread(() -> displayAlertPromptImpl(alertPromptCaption, text, alertPromptButtonConfig).show()); - - // Wait for the lock to notify that it is complete - synchronized (alertPromptLock) { - try { - alertPromptLock.wait(); - } catch (Exception e) { - } - } - alertPromptInProgress = false; - - return alertPromptResult; - } - - public static MaterialAlertDialogBuilder displayAlertPromptImpl(String caption, String text, int buttonConfig) { - final EmulationActivity emulationActivity = sEmulationActivity.get(); - alertPromptResult = ""; - alertPromptButton = 0; - - FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); - params.leftMargin = params.rightMargin = YuzuApplication.getAppContext().getResources().getDimensionPixelSize(R.dimen.dialog_margin); - - // Set up the input - alertPromptEditText = new EditText(YuzuApplication.getAppContext()); - alertPromptEditText.setText(text); - alertPromptEditText.setSingleLine(); - alertPromptEditText.setLayoutParams(params); - - FrameLayout container = new FrameLayout(emulationActivity); - container.addView(alertPromptEditText); - - MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(emulationActivity) - .setTitle(caption) - .setView(container) - .setPositiveButton(android.R.string.ok, (dialogInterface, i) -> - { - alertPromptButton = buttonConfig; - alertPromptResult = alertPromptEditText.getText().toString(); - synchronized (alertPromptLock) { - alertPromptLock.notifyAll(); - } - }) - .setOnDismissListener(dialogInterface -> - { - alertPromptResult = ""; - synchronized (alertPromptLock) { - alertPromptLock.notifyAll(); - } - }); - - if (buttonConfig > 0) { - builder.setNegativeButton(android.R.string.cancel, (dialogInterface, i) -> - { - alertPromptResult = ""; - synchronized (alertPromptLock) { - alertPromptLock.notifyAll(); - } - }); - } - - return builder; - } - - public static int alertPromptButton() { - return alertPromptButton; - } - - public static void exitEmulationActivity(int resultCode) { - final int Success = 0; - final int ErrorNotInitialized = 1; - final int ErrorGetLoader = 2; - final int ErrorSystemFiles = 3; - final int ErrorSharedFont = 4; - final int ErrorVideoCore = 5; - final int ErrorUnknown = 6; - final int ErrorLoader = 7; - - int captionId; - int descriptionId; - switch (resultCode) { - case ErrorVideoCore: - captionId = R.string.loader_error_video_core; - descriptionId = R.string.loader_error_video_core_description; - break; - default: - captionId = R.string.loader_error_encrypted; - descriptionId = R.string.loader_error_encrypted_roms_description; - if (!ReloadKeys()) { - descriptionId = R.string.loader_error_encrypted_keys_description; - } - break; - } - - final EmulationActivity emulationActivity = sEmulationActivity.get(); - if (emulationActivity == null) { - Log.warning("[NativeLibrary] EmulationActivity is null, can't exit."); - return; - } - - MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(emulationActivity) - .setTitle(captionId) - .setMessage(Html.fromHtml(emulationActivity.getString(descriptionId), Html.FROM_HTML_MODE_LEGACY)) - .setPositiveButton(android.R.string.ok, (dialog, whichButton) -> emulationActivity.finish()) - .setOnDismissListener(dialogInterface -> emulationActivity.finish()); - emulationActivity.runOnUiThread(() -> { - AlertDialog alert = builder.create(); - alert.show(); - ((TextView) alert.findViewById(android.R.id.message)).setMovementMethod(LinkMovementMethod.getInstance()); - }); - } - - public static void setEmulationActivity(EmulationActivity emulationActivity) { - Log.verbose("[NativeLibrary] Registering EmulationActivity."); - sEmulationActivity = new WeakReference<>(emulationActivity); - } - - public static void clearEmulationActivity() { - Log.verbose("[NativeLibrary] Unregistering EmulationActivity."); - - sEmulationActivity.clear(); - } - - private static final Object cameraPermissionLock = new Object(); - private static boolean cameraPermissionGranted = false; - public static final int REQUEST_CODE_NATIVE_CAMERA = 800; - - public static boolean RequestCameraPermission() { - final EmulationActivity emulationActivity = sEmulationActivity.get(); - if (emulationActivity == null) { - Log.error("[NativeLibrary] EmulationActivity not present"); - return false; - } - if (ContextCompat.checkSelfPermission(emulationActivity, CAMERA) == PackageManager.PERMISSION_GRANTED) { - // Permission already granted - return true; - } - emulationActivity.requestPermissions(new String[]{CAMERA}, REQUEST_CODE_NATIVE_CAMERA); - - // Wait until result is returned - synchronized (cameraPermissionLock) { - try { - cameraPermissionLock.wait(); - } catch (InterruptedException ignored) { - } - } - return cameraPermissionGranted; - } - - public static void CameraPermissionResult(boolean granted) { - cameraPermissionGranted = granted; - synchronized (cameraPermissionLock) { - cameraPermissionLock.notify(); - } - } - - private static final Object micPermissionLock = new Object(); - private static boolean micPermissionGranted = false; - public static final int REQUEST_CODE_NATIVE_MIC = 900; - - public static boolean RequestMicPermission() { - final EmulationActivity emulationActivity = sEmulationActivity.get(); - if (emulationActivity == null) { - Log.error("[NativeLibrary] EmulationActivity not present"); - return false; - } - if (ContextCompat.checkSelfPermission(emulationActivity, RECORD_AUDIO) == PackageManager.PERMISSION_GRANTED) { - // Permission already granted - return true; - } - emulationActivity.requestPermissions(new String[]{RECORD_AUDIO}, REQUEST_CODE_NATIVE_MIC); - - // Wait until result is returned - synchronized (micPermissionLock) { - try { - micPermissionLock.wait(); - } catch (InterruptedException ignored) { - } - } - return micPermissionGranted; - } - - public static void MicPermissionResult(boolean granted) { - micPermissionGranted = granted; - synchronized (micPermissionLock) { - micPermissionLock.notify(); - } - } - - /** - * Logs the Citra version, Android version and, CPU. - */ - public static native void LogDeviceInfo(); - - /** - * Submits inline keyboard text. Called on input for buttons that result text. - * @param text Text to submit to the inline software keyboard implementation. - */ - public static native void SubmitInlineKeyboardText(String text); - - /** - * Submits inline keyboard input. Used to indicate keys pressed that are not text. - * @param key_code Android Key Code associated with the keyboard input. - */ - public static native void SubmitInlineKeyboardInput(int key_code); - - /** - * Button type for use in onTouchEvent - */ - public static final class ButtonType { - public static final int BUTTON_A = 0; - public static final int BUTTON_B = 1; - public static final int BUTTON_X = 2; - public static final int BUTTON_Y = 3; - public static final int STICK_L = 4; - public static final int STICK_R = 5; - public static final int TRIGGER_L = 6; - public static final int TRIGGER_R = 7; - public static final int TRIGGER_ZL = 8; - public static final int TRIGGER_ZR = 9; - public static final int BUTTON_PLUS = 10; - public static final int BUTTON_MINUS = 11; - public static final int DPAD_LEFT = 12; - public static final int DPAD_UP = 13; - public static final int DPAD_RIGHT = 14; - public static final int DPAD_DOWN = 15; - public static final int BUTTON_SL = 16; - public static final int BUTTON_SR = 17; - public static final int BUTTON_HOME = 18; - public static final int BUTTON_CAPTURE = 19; - } - - /** - * Stick type for use in onTouchEvent - */ - public static final class StickType { - public static final int STICK_L = 0; - public static final int STICK_R = 1; - } - - /** - * Button states - */ - public static final class ButtonState { - public static final int RELEASED = 0; - public static final int PRESSED = 1; - } -} diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/NativeLibrary.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/NativeLibrary.kt new file mode 100644 index 000000000..725917ace --- /dev/null +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/NativeLibrary.kt @@ -0,0 +1,463 @@ +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +package org.yuzu.yuzu_emu + +import android.app.Dialog +import android.content.DialogInterface +import android.os.Bundle +import android.text.Html +import android.text.method.LinkMovementMethod +import android.view.Surface +import android.view.View +import android.widget.TextView +import androidx.fragment.app.DialogFragment +import com.google.android.material.dialog.MaterialAlertDialogBuilder +import org.yuzu.yuzu_emu.YuzuApplication.Companion.appContext +import org.yuzu.yuzu_emu.activities.EmulationActivity +import org.yuzu.yuzu_emu.utils.DocumentsTree.Companion.isNativePath +import org.yuzu.yuzu_emu.utils.FileUtil.getFileSize +import org.yuzu.yuzu_emu.utils.FileUtil.openContentUri +import org.yuzu.yuzu_emu.utils.Log.error +import org.yuzu.yuzu_emu.utils.Log.verbose +import org.yuzu.yuzu_emu.utils.Log.warning +import org.yuzu.yuzu_emu.utils.SerializableHelper.serializable +import java.lang.ref.WeakReference + +/** + * Class which contains methods that interact + * with the native side of the Yuzu code. + */ +object NativeLibrary { + /** + * Default controller id for each device + */ + const val Player1Device = 0 + const val Player2Device = 1 + const val Player3Device = 2 + const val Player4Device = 3 + const val Player5Device = 4 + const val Player6Device = 5 + const val Player7Device = 6 + const val Player8Device = 7 + const val ConsoleDevice = 8 + + var sEmulationActivity = WeakReference(null) + + init { + try { + System.loadLibrary("yuzu-android") + } catch (ex: UnsatisfiedLinkError) { + error("[NativeLibrary] $ex") + } + } + + @JvmStatic + fun openContentUri(path: String?, openmode: String?): Int { + return if (isNativePath(path!!)) { + YuzuApplication.documentsTree!!.openContentUri(path, openmode) + } else openContentUri(appContext, path, openmode) + } + + @JvmStatic + fun getSize(path: String?): Long { + return if (isNativePath(path!!)) { + YuzuApplication.documentsTree!!.getFileSize(path) + } else getFileSize(appContext, path) + } + + /** + * Handles button press events for a gamepad. + * + * @param Device The input descriptor of the gamepad. + * @param Button Key code identifying which button was pressed. + * @param Action Mask identifying which action is happening (button pressed down, or button released). + * @return If we handled the button press. + */ + external fun onGamePadButtonEvent(Device: Int, Button: Int, Action: Int): Boolean + + /** + * Handles joystick movement events. + * + * @param Device The device ID of the gamepad. + * @param Axis The axis ID + * @param x_axis The value of the x-axis represented by the given ID. + * @param y_axis The value of the y-axis represented by the given ID. + */ + external fun onGamePadJoystickEvent( + Device: Int, + Axis: Int, + x_axis: Float, + y_axis: Float + ): Boolean + + /** + * Handles motion events. + * + * @param delta_timestamp The finger id corresponding to this event + * @param gyro_x,gyro_y,gyro_z The value of the accelerometer sensor. + * @param accel_x,accel_y,accel_z The value of the y-axis + */ + external fun onGamePadMotionEvent( + Device: Int, + delta_timestamp: Long, + gyro_x: Float, + gyro_y: Float, + gyro_z: Float, + accel_x: Float, + accel_y: Float, + accel_z: Float + ): Boolean + + /** + * Signals and load a nfc tag + * + * @param data Byte array containing all the data from a nfc tag + */ + external fun onReadNfcTag(data: ByteArray?): Boolean + + /** + * Removes current loaded nfc tag + */ + external fun onRemoveNfcTag(): Boolean + + /** + * Handles touch press events. + * + * @param finger_id The finger id corresponding to this event + * @param x_axis The value of the x-axis. + * @param y_axis The value of the y-axis. + */ + external fun onTouchPressed(finger_id: Int, x_axis: Float, y_axis: Float) + + /** + * Handles touch movement. + * + * @param x_axis The value of the instantaneous x-axis. + * @param y_axis The value of the instantaneous y-axis. + */ + external fun onTouchMoved(finger_id: Int, x_axis: Float, y_axis: Float) + + /** + * Handles touch release events. + * + * @param finger_id The finger id corresponding to this event + */ + external fun onTouchReleased(finger_id: Int) + + external fun reloadSettings() + + external fun getUserSetting(gameID: String?, Section: String?, Key: String?): String? + + external fun setUserSetting(gameID: String?, Section: String?, Key: String?, Value: String?) + + external fun initGameIni(gameID: String?) + + /** + * Gets the embedded icon within the given ROM. + * + * @param filename the file path to the ROM. + * @return a byte array containing the JPEG data for the icon. + */ + external fun getIcon(filename: String): ByteArray + + /** + * Gets the embedded title of the given ISO/ROM. + * + * @param filename The file path to the ISO/ROM. + * @return the embedded title of the ISO/ROM. + */ + external fun getTitle(filename: String): String + + external fun getDescription(filename: String): String + + external fun getGameId(filename: String): String + + external fun getRegions(filename: String): String + + external fun getCompany(filename: String): String + + external fun setAppDirectory(directory: String) + + external fun initializeGpuDriver( + hookLibDir: String?, + customDriverDir: String?, + customDriverName: String?, + fileRedirectDir: String? + ) + + external fun reloadKeys(): Boolean + + external fun initializeEmulation() + + external fun defaultCPUCore(): Int + + /** + * Begins emulation. + */ + external fun run(path: String?) + + /** + * Begins emulation from the specified savestate. + */ + external fun run(path: String?, savestatePath: String?, deleteSavestate: Boolean) + + // Surface Handling + external fun surfaceChanged(surf: Surface?) + + external fun surfaceDestroyed() + + external fun doFrame() + + /** + * Unpauses emulation from a paused state. + */ + external fun unPauseEmulation() + + /** + * Pauses emulation. + */ + external fun pauseEmulation() + + /** + * Stops emulation. + */ + external fun stopEmulation() + + /** + * Resets the in-memory ROM metadata cache. + */ + external fun resetRomMetadata() + + /** + * Returns true if emulation is running (or is paused). + */ + external fun isRunning(): Boolean + + /** + * Returns the performance stats for the current game + */ + external fun getPerfStats(): DoubleArray + + /** + * Notifies the core emulation that the orientation has changed. + */ + external fun notifyOrientationChange(layout_option: Int, rotation: Int) + + enum class CoreError { + ErrorSystemFiles, + ErrorSavestate, + ErrorUnknown + } + + private var coreErrorAlertResult = false + private val coreErrorAlertLock = Object() + + class CoreErrorDialogFragment : DialogFragment() { + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + val title = requireArguments().serializable("title") + val message = requireArguments().serializable("message") + + return MaterialAlertDialogBuilder(requireActivity()) + .setTitle(title) + .setMessage(message) + .setPositiveButton(R.string.continue_button, null) + .setNegativeButton(R.string.abort_button) { _: DialogInterface?, _: Int -> + coreErrorAlertResult = false + synchronized(coreErrorAlertLock) { coreErrorAlertLock.notify() } + } + .create() + } + + override fun onDismiss(dialog: DialogInterface) { + coreErrorAlertResult = true + synchronized(coreErrorAlertLock) { coreErrorAlertLock.notify() } + } + + companion object { + fun newInstance(title: String?, message: String?): CoreErrorDialogFragment { + val frag = CoreErrorDialogFragment() + val args = Bundle() + args.putString("title", title) + args.putString("message", message) + frag.arguments = args + return frag + } + } + } + + private fun onCoreErrorImpl(title: String, message: String) { + val emulationActivity = sEmulationActivity.get() + if (emulationActivity == null) { + error("[NativeLibrary] EmulationActivity not present") + return + } + + val fragment = CoreErrorDialogFragment.newInstance(title, message) + fragment.show(emulationActivity.supportFragmentManager, "coreError") + } + + /** + * Handles a core error. + * + * @return true: continue; false: abort + */ + fun onCoreError(error: CoreError?, details: String): Boolean { + val emulationActivity = sEmulationActivity.get() + if (emulationActivity == null) { + error("[NativeLibrary] EmulationActivity not present") + return false + } + + val title: String + val message: String + when (error) { + CoreError.ErrorSystemFiles -> { + title = emulationActivity.getString(R.string.system_archive_not_found) + message = emulationActivity.getString( + R.string.system_archive_not_found_message, + details.ifEmpty { emulationActivity.getString(R.string.system_archive_general) } + ) + } + CoreError.ErrorSavestate -> { + title = emulationActivity.getString(R.string.save_load_error) + message = details + } + CoreError.ErrorUnknown -> { + title = emulationActivity.getString(R.string.fatal_error) + message = emulationActivity.getString(R.string.fatal_error_message) + } + else -> { + return true + } + } + + // Show the AlertDialog on the main thread. + emulationActivity.runOnUiThread(Runnable { onCoreErrorImpl(title, message) }) + + // Wait for the lock to notify that it is complete. + synchronized(coreErrorAlertLock) { coreErrorAlertLock.wait() } + + return coreErrorAlertResult + } + + @JvmStatic + fun exitEmulationActivity(resultCode: Int) { + val Success = 0 + val ErrorNotInitialized = 1 + val ErrorGetLoader = 2 + val ErrorSystemFiles = 3 + val ErrorSharedFont = 4 + val ErrorVideoCore = 5 + val ErrorUnknown = 6 + val ErrorLoader = 7 + + val captionId: Int + var descriptionId: Int + when (resultCode) { + ErrorVideoCore -> { + captionId = R.string.loader_error_video_core + descriptionId = R.string.loader_error_video_core_description + } + else -> { + captionId = R.string.loader_error_encrypted + descriptionId = R.string.loader_error_encrypted_roms_description + if (!reloadKeys()) { + descriptionId = R.string.loader_error_encrypted_keys_description + } + } + } + + val emulationActivity = sEmulationActivity.get() + if (emulationActivity == null) { + warning("[NativeLibrary] EmulationActivity is null, can't exit.") + return + } + + val builder = MaterialAlertDialogBuilder(emulationActivity) + .setTitle(captionId) + .setMessage( + Html.fromHtml( + emulationActivity.getString(descriptionId), + Html.FROM_HTML_MODE_LEGACY + ) + ) + .setPositiveButton(android.R.string.ok) { _: DialogInterface?, _: Int -> emulationActivity.finish() } + .setOnDismissListener { emulationActivity.finish() } + emulationActivity.runOnUiThread { + val alert = builder.create() + alert.show() + (alert.findViewById(android.R.id.message) as TextView).movementMethod = + LinkMovementMethod.getInstance() + } + } + + fun setEmulationActivity(emulationActivity: EmulationActivity?) { + verbose("[NativeLibrary] Registering EmulationActivity.") + sEmulationActivity = WeakReference(emulationActivity) + } + + fun clearEmulationActivity() { + verbose("[NativeLibrary] Unregistering EmulationActivity.") + sEmulationActivity.clear() + } + + /** + * Logs the Yuzu version, Android version and, CPU. + */ + external fun logDeviceInfo() + + /** + * Submits inline keyboard text. Called on input for buttons that result text. + * @param text Text to submit to the inline software keyboard implementation. + */ + external fun submitInlineKeyboardText(text: String?) + + /** + * Submits inline keyboard input. Used to indicate keys pressed that are not text. + * @param key_code Android Key Code associated with the keyboard input. + */ + external fun submitInlineKeyboardInput(key_code: Int) + + /** + * Button type for use in onTouchEvent + */ + object ButtonType { + const val BUTTON_A = 0 + const val BUTTON_B = 1 + const val BUTTON_X = 2 + const val BUTTON_Y = 3 + const val STICK_L = 4 + const val STICK_R = 5 + const val TRIGGER_L = 6 + const val TRIGGER_R = 7 + const val TRIGGER_ZL = 8 + const val TRIGGER_ZR = 9 + const val BUTTON_PLUS = 10 + const val BUTTON_MINUS = 11 + const val DPAD_LEFT = 12 + const val DPAD_UP = 13 + const val DPAD_RIGHT = 14 + const val DPAD_DOWN = 15 + const val BUTTON_SL = 16 + const val BUTTON_SR = 17 + const val BUTTON_HOME = 18 + const val BUTTON_CAPTURE = 19 + } + + /** + * Stick type for use in onTouchEvent + */ + object StickType { + const val STICK_L = 0 + const val STICK_R = 1 + } + + /** + * Button states + */ + object ButtonState { + const val RELEASED = 0 + const val PRESSED = 1 + } +} diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/YuzuApplication.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/YuzuApplication.kt index f81b4da40..f987c6b7b 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/YuzuApplication.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/YuzuApplication.kt @@ -40,7 +40,7 @@ class YuzuApplication : Application() { documentsTree = DocumentsTree() DirectoryInitialization.start(applicationContext) GpuDriverHelper.initializeDriverParameters(applicationContext) - NativeLibrary.LogDeviceInfo() + NativeLibrary.logDeviceInfo() // TODO(bunnei): Disable notifications until we support app suspension. //createNotificationChannel(); diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/activities/EmulationActivity.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/activities/EmulationActivity.kt index 32d04ef31..f1f92841c 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/activities/EmulationActivity.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/activities/EmulationActivity.kt @@ -100,10 +100,10 @@ open class EmulationActivity : AppCompatActivity() { val textChar = event.unicodeChar if (textChar == 0) { // No text, button input. - NativeLibrary.SubmitInlineKeyboardInput(keyCode) + NativeLibrary.submitInlineKeyboardInput(keyCode) } else { // Text submitted. - NativeLibrary.SubmitInlineKeyboardText(textChar.toChar().toString()) + NativeLibrary.submitInlineKeyboardText(textChar.toChar().toString()) } } } @@ -132,9 +132,6 @@ open class EmulationActivity : AppCompatActivity() { private fun restoreState(savedInstanceState: Bundle) { game = savedInstanceState.parcelable(EXTRA_SELECTED_GAME)!! - - // If an alert prompt was in progress when state was restored, retry displaying it - NativeLibrary.retryDisplayAlertPrompt() } private fun enableFullscreenImmersive() { diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/GameAdapter.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/GameAdapter.kt index 024676185..af83f05c1 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/GameAdapter.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/GameAdapter.kt @@ -93,7 +93,7 @@ class GameAdapter(private val activity: AppCompatActivity, var games: ArrayList< } private fun decodeGameIcon(uri: String): Bitmap? { - val data = NativeLibrary.GetIcon(uri) + val data = NativeLibrary.getIcon(uri) return BitmapFactory.decodeByteArray( data, 0, diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/applets/keyboard/SoftwareKeyboard.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/applets/keyboard/SoftwareKeyboard.kt index 704109ec0..e6485d039 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/applets/keyboard/SoftwareKeyboard.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/applets/keyboard/SoftwareKeyboard.kt @@ -48,7 +48,7 @@ object SoftwareKeyboard { } // No longer visible, submit the result. - NativeLibrary.SubmitInlineKeyboardInput(KeyEvent.KEYCODE_ENTER) + NativeLibrary.submitInlineKeyboardInput(KeyEvent.KEYCODE_ENTER) } }, delayMs.toLong()) } diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsActivity.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsActivity.kt index a655500f8..0f2c23827 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsActivity.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsActivity.kt @@ -85,7 +85,7 @@ class SettingsActivity : AppCompatActivity(), SettingsActivityView { presenter.onStop(isFinishing) // Update framebuffer layout when closing the settings - NativeLibrary.NotifyOrientationChange( + NativeLibrary.notifyOrientationChange( EmulationMenuSettings.landscapeScreenLayout, windowManager.defaultDisplay.rotation ) diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsActivityPresenter.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsActivityPresenter.kt index 8c90156e3..e435c6d58 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsActivityPresenter.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsActivityPresenter.kt @@ -63,7 +63,7 @@ class SettingsActivityPresenter(private val activityView: SettingsActivityView) Log.debug("[SettingsActivity] Settings activity stopping. Saving settings to INI...") settings.saveSettings(activityView) } - NativeLibrary.ReloadSettings() + NativeLibrary.reloadSettings() } fun onSettingChanged() { diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/utils/SettingsFile.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/utils/SettingsFile.kt index 87ad64142..37ae39fe6 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/utils/SettingsFile.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/utils/SettingsFile.kt @@ -155,7 +155,7 @@ object SettingsFile { val sortedKeySet: Set = TreeSet(settings.keys) for (settingKey in sortedKeySet) { val setting = settings[settingKey] - NativeLibrary.SetUserSetting( + NativeLibrary.setUserSetting( gameId, mapSectionNameFromIni( section.name ), setting!!.key, setting.valueAsString diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt index daee937ca..1d4641d5c 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt @@ -182,7 +182,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { val FRAMETIME = 2 val SPEED = 3 perfStatsUpdater = { - val perfStats = NativeLibrary.GetPerfStats() + val perfStats = NativeLibrary.getPerfStats() if (perfStats[FPS] > 0 && _binding != null) { binding.showFpsText.text = String.format("FPS: %.1f", perfStats[FPS]) } @@ -333,7 +333,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { if (state != State.STOPPED) { Log.debug("[EmulationFragment] Stopping emulation.") state = State.STOPPED - NativeLibrary.StopEmulation() + NativeLibrary.stopEmulation() } else { Log.warning("[EmulationFragment] Stop called while already stopped.") } @@ -347,8 +347,8 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { Log.debug("[EmulationFragment] Pausing emulation.") // Release the surface before pausing, since emulation has to be running for that. - NativeLibrary.SurfaceDestroyed() - NativeLibrary.PauseEmulation() + NativeLibrary.surfaceDestroyed() + NativeLibrary.pauseEmulation() } else { Log.warning("[EmulationFragment] Pause called while already paused.") } @@ -357,7 +357,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { @Synchronized fun run(isActivityRecreated: Boolean) { if (isActivityRecreated) { - if (NativeLibrary.IsRunning()) { + if (NativeLibrary.isRunning()) { state = State.PAUSED } } else { @@ -390,7 +390,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { Log.debug("[EmulationFragment] Surface destroyed.") when (state) { State.RUNNING -> { - NativeLibrary.SurfaceDestroyed() + NativeLibrary.surfaceDestroyed() state = State.PAUSED } State.PAUSED -> Log.warning("[EmulationFragment] Surface cleared while emulation paused.") @@ -403,17 +403,17 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { runWhenSurfaceIsValid = false when (state) { State.STOPPED -> { - NativeLibrary.SurfaceChanged(surface) + NativeLibrary.surfaceChanged(surface) val mEmulationThread = Thread({ Log.debug("[EmulationFragment] Starting emulation thread.") - NativeLibrary.Run(mGamePath) + NativeLibrary.run(mGamePath) }, "NativeEmulation") mEmulationThread.start() } State.PAUSED -> { Log.debug("[EmulationFragment] Resuming emulation.") - NativeLibrary.SurfaceChanged(surface) - NativeLibrary.UnPauseEmulation() + NativeLibrary.surfaceChanged(surface) + NativeLibrary.unPauseEmulation() } else -> Log.debug("[EmulationFragment] Bug, run called while already running.") } diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt index b6ad72591..69a371947 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt @@ -142,7 +142,7 @@ class MainActivity : AppCompatActivity(), MainView { private fun refreshFragment() { if (platformGamesFragment != null) { - NativeLibrary.ResetRomMetadata() + NativeLibrary.resetRomMetadata() platformGamesFragment!!.refresh() } } @@ -194,7 +194,7 @@ class MainActivity : AppCompatActivity(), MainView { val dstPath = DirectoryInitialization.userDirectory + "/keys/" if (FileUtil.copyUriToInternalStorage(this, result, dstPath, "prod.keys")) { - if (NativeLibrary.ReloadKeys()) { + if (NativeLibrary.reloadKeys()) { Toast.makeText( this, R.string.install_keys_success, @@ -225,7 +225,7 @@ class MainActivity : AppCompatActivity(), MainView { val dstPath = DirectoryInitialization.userDirectory + "/keys/" if (FileUtil.copyUriToInternalStorage(this, result, dstPath, "key_retail.bin")) { - if (NativeLibrary.ReloadKeys()) { + if (NativeLibrary.reloadKeys()) { Toast.makeText( this, R.string.install_keys_success, diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/DirectoryInitialization.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/DirectoryInitialization.kt index 7b66bf220..6cd0e9d1d 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/DirectoryInitialization.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/DirectoryInitialization.kt @@ -16,7 +16,7 @@ object DirectoryInitialization { fun start(context: Context) { if (!areDirectoriesReady) { initializeInternalStorage(context) - NativeLibrary.InitializeEmulation() + NativeLibrary.initializeEmulation() areDirectoriesReady = true } } @@ -30,7 +30,7 @@ object DirectoryInitialization { private fun initializeInternalStorage(context: Context) { try { userPath = context.getExternalFilesDir(null)!!.canonicalPath - NativeLibrary.SetAppDirectory(userPath) + NativeLibrary.setAppDirectory(userPath!!) } catch (e: IOException) { e.printStackTrace() } diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/GameHelper.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/GameHelper.kt index 6dfd8b7f8..c463a66d8 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/GameHelper.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/GameHelper.kt @@ -22,7 +22,7 @@ object GameHelper { val gamesUri = Uri.parse(gamesDir) // Ensure keys are loaded so that ROM metadata can be decrypted. - NativeLibrary.ReloadKeys() + NativeLibrary.reloadKeys() val children = FileUtil.listFiles(context, gamesUri) for (file in children) { @@ -44,13 +44,13 @@ object GameHelper { } private fun getGame(filePath: String): Game { - var name = NativeLibrary.GetTitle(filePath) + var name = NativeLibrary.getTitle(filePath) // If the game's title field is empty, use the filename. if (name.isEmpty()) { name = filePath.substring(filePath.lastIndexOf("/") + 1) } - var gameId = NativeLibrary.GetGameId(filePath) + var gameId = NativeLibrary.getGameId(filePath) // If the game's ID field is empty, use the filename without extension. if (gameId.isEmpty()) { @@ -62,11 +62,11 @@ object GameHelper { return Game( name, - NativeLibrary.GetDescription(filePath).replace("\n", " "), - NativeLibrary.GetRegions(filePath), + NativeLibrary.getDescription(filePath).replace("\n", " "), + NativeLibrary.getRegions(filePath), filePath, gameId, - NativeLibrary.GetCompany(filePath) + NativeLibrary.getCompany(filePath) ) } } diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/GpuDriverHelper.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/GpuDriverHelper.kt index 598c6808b..236c7bc23 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/GpuDriverHelper.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/GpuDriverHelper.kt @@ -67,7 +67,7 @@ object GpuDriverHelper { hookLibPath = context.applicationInfo.nativeLibraryDir + "/" // Initialize GPU driver. - NativeLibrary.InitializeGpuDriver( + NativeLibrary.initializeGpuDriver( hookLibPath, driverInstallationPath, customDriverLibraryName, diff --git a/src/android/app/src/main/jni/native.cpp b/src/android/app/src/main/jni/native.cpp index ce713b80f..a170b57aa 100644 --- a/src/android/app/src/main/jni/native.cpp +++ b/src/android/app/src/main/jni/native.cpp @@ -353,32 +353,32 @@ static Core::SystemResultStatus RunEmulation(const std::string& filepath) { extern "C" { -void Java_org_yuzu_yuzu_1emu_NativeLibrary_SurfaceChanged(JNIEnv* env, +void Java_org_yuzu_yuzu_1emu_NativeLibrary_surfaceChanged(JNIEnv* env, [[maybe_unused]] jclass clazz, jobject surf) { EmulationSession::GetInstance().SetNativeWindow(ANativeWindow_fromSurface(env, surf)); EmulationSession::GetInstance().SurfaceChanged(); } -void Java_org_yuzu_yuzu_1emu_NativeLibrary_SurfaceDestroyed(JNIEnv* env, +void Java_org_yuzu_yuzu_1emu_NativeLibrary_surfaceDestroyed(JNIEnv* env, [[maybe_unused]] jclass clazz) { ANativeWindow_release(EmulationSession::GetInstance().NativeWindow()); EmulationSession::GetInstance().SetNativeWindow(nullptr); EmulationSession::GetInstance().SurfaceChanged(); } -void Java_org_yuzu_yuzu_1emu_NativeLibrary_NotifyOrientationChange(JNIEnv* env, +void Java_org_yuzu_yuzu_1emu_NativeLibrary_notifyOrientationChange(JNIEnv* env, [[maybe_unused]] jclass clazz, jint layout_option, jint rotation) {} -void Java_org_yuzu_yuzu_1emu_NativeLibrary_SetAppDirectory(JNIEnv* env, +void Java_org_yuzu_yuzu_1emu_NativeLibrary_setAppDirectory(JNIEnv* env, [[maybe_unused]] jclass clazz, jstring j_directory) { Common::FS::SetAppDirectory(GetJString(env, j_directory)); } -void JNICALL Java_org_yuzu_yuzu_1emu_NativeLibrary_InitializeGpuDriver( +void JNICALL Java_org_yuzu_yuzu_1emu_NativeLibrary_initializeGpuDriver( JNIEnv* env, [[maybe_unused]] jclass clazz, jstring hook_lib_dir, jstring custom_driver_dir, jstring custom_driver_name, jstring file_redirect_dir) { EmulationSession::GetInstance().InitializeGpuDriver( @@ -386,33 +386,33 @@ void JNICALL Java_org_yuzu_yuzu_1emu_NativeLibrary_InitializeGpuDriver( GetJString(env, custom_driver_name), GetJString(env, file_redirect_dir)); } -jboolean Java_org_yuzu_yuzu_1emu_NativeLibrary_ReloadKeys(JNIEnv* env, +jboolean Java_org_yuzu_yuzu_1emu_NativeLibrary_reloadKeys(JNIEnv* env, [[maybe_unused]] jclass clazz) { Core::Crypto::KeyManager::Instance().ReloadKeys(); return static_cast(Core::Crypto::KeyManager::Instance().AreKeysLoaded()); } -void Java_org_yuzu_yuzu_1emu_NativeLibrary_UnPauseEmulation([[maybe_unused]] JNIEnv* env, +void Java_org_yuzu_yuzu_1emu_NativeLibrary_unPauseEmulation([[maybe_unused]] JNIEnv* env, [[maybe_unused]] jclass clazz) { EmulationSession::GetInstance().UnPauseEmulation(); } -void Java_org_yuzu_yuzu_1emu_NativeLibrary_PauseEmulation([[maybe_unused]] JNIEnv* env, +void Java_org_yuzu_yuzu_1emu_NativeLibrary_pauseEmulation([[maybe_unused]] JNIEnv* env, [[maybe_unused]] jclass clazz) { EmulationSession::GetInstance().PauseEmulation(); } -void Java_org_yuzu_yuzu_1emu_NativeLibrary_StopEmulation([[maybe_unused]] JNIEnv* env, +void Java_org_yuzu_yuzu_1emu_NativeLibrary_stopEmulation([[maybe_unused]] JNIEnv* env, [[maybe_unused]] jclass clazz) { EmulationSession::GetInstance().HaltEmulation(); } -void Java_org_yuzu_yuzu_1emu_NativeLibrary_ResetRomMetadata([[maybe_unused]] JNIEnv* env, +void Java_org_yuzu_yuzu_1emu_NativeLibrary_resetRomMetadata([[maybe_unused]] JNIEnv* env, [[maybe_unused]] jclass clazz) { EmulationSession::GetInstance().ResetRomMetadata(); } -jboolean Java_org_yuzu_yuzu_1emu_NativeLibrary_IsRunning([[maybe_unused]] JNIEnv* env, +jboolean Java_org_yuzu_yuzu_1emu_NativeLibrary_isRunning([[maybe_unused]] JNIEnv* env, [[maybe_unused]] jclass clazz) { return static_cast(EmulationSession::GetInstance().IsRunning()); } @@ -492,7 +492,7 @@ void Java_org_yuzu_yuzu_1emu_NativeLibrary_onTouchReleased([[maybe_unused]] JNIE } } -jbyteArray Java_org_yuzu_yuzu_1emu_NativeLibrary_GetIcon([[maybe_unused]] JNIEnv* env, +jbyteArray Java_org_yuzu_yuzu_1emu_NativeLibrary_getIcon([[maybe_unused]] JNIEnv* env, [[maybe_unused]] jclass clazz, [[maybe_unused]] jstring j_filename) { auto icon_data = EmulationSession::GetInstance().GetRomIcon(GetJString(env, j_filename)); @@ -502,43 +502,38 @@ jbyteArray Java_org_yuzu_yuzu_1emu_NativeLibrary_GetIcon([[maybe_unused]] JNIEnv return icon; } -jstring Java_org_yuzu_yuzu_1emu_NativeLibrary_GetTitle([[maybe_unused]] JNIEnv* env, +jstring Java_org_yuzu_yuzu_1emu_NativeLibrary_getTitle([[maybe_unused]] JNIEnv* env, [[maybe_unused]] jclass clazz, [[maybe_unused]] jstring j_filename) { auto title = EmulationSession::GetInstance().GetRomTitle(GetJString(env, j_filename)); return env->NewStringUTF(title.c_str()); } -jstring Java_org_yuzu_yuzu_1emu_NativeLibrary_GetDescription([[maybe_unused]] JNIEnv* env, +jstring Java_org_yuzu_yuzu_1emu_NativeLibrary_getDescription([[maybe_unused]] JNIEnv* env, [[maybe_unused]] jclass clazz, jstring j_filename) { return j_filename; } -jstring Java_org_yuzu_yuzu_1emu_NativeLibrary_GetGameId([[maybe_unused]] JNIEnv* env, +jstring Java_org_yuzu_yuzu_1emu_NativeLibrary_getGameId([[maybe_unused]] JNIEnv* env, [[maybe_unused]] jclass clazz, jstring j_filename) { return j_filename; } -jstring Java_org_yuzu_yuzu_1emu_NativeLibrary_GetRegions([[maybe_unused]] JNIEnv* env, +jstring Java_org_yuzu_yuzu_1emu_NativeLibrary_getRegions([[maybe_unused]] JNIEnv* env, [[maybe_unused]] jclass clazz, [[maybe_unused]] jstring j_filename) { return env->NewStringUTF(""); } -jstring Java_org_yuzu_yuzu_1emu_NativeLibrary_GetCompany([[maybe_unused]] JNIEnv* env, +jstring Java_org_yuzu_yuzu_1emu_NativeLibrary_getCompany([[maybe_unused]] JNIEnv* env, [[maybe_unused]] jclass clazz, [[maybe_unused]] jstring j_filename) { return env->NewStringUTF(""); } -jstring Java_org_yuzu_yuzu_1emu_NativeLibrary_GetGitRevision([[maybe_unused]] JNIEnv* env, - [[maybe_unused]] jclass clazz) { - return {}; -} - -void Java_org_yuzu_yuzu_1emu_NativeLibrary_InitializeEmulation +void Java_org_yuzu_yuzu_1emu_NativeLibrary_initializeEmulation [[maybe_unused]] (JNIEnv* env, [[maybe_unused]] jclass clazz) { // Create the default config.ini. Config{}; @@ -546,21 +541,21 @@ void Java_org_yuzu_yuzu_1emu_NativeLibrary_InitializeEmulation EmulationSession::GetInstance().System().Initialize(); } -jint Java_org_yuzu_yuzu_1emu_NativeLibrary_DefaultCPUCore([[maybe_unused]] JNIEnv* env, +jint Java_org_yuzu_yuzu_1emu_NativeLibrary_defaultCPUCore([[maybe_unused]] JNIEnv* env, [[maybe_unused]] jclass clazz) { return {}; } -void Java_org_yuzu_yuzu_1emu_NativeLibrary_Run__Ljava_lang_String_2Ljava_lang_String_2Z( +void Java_org_yuzu_yuzu_1emu_NativeLibrary_run__Ljava_lang_String_2Ljava_lang_String_2Z( [[maybe_unused]] JNIEnv* env, [[maybe_unused]] jclass clazz, [[maybe_unused]] jstring j_file, [[maybe_unused]] jstring j_savestate, [[maybe_unused]] jboolean j_delete_savestate) {} -void Java_org_yuzu_yuzu_1emu_NativeLibrary_ReloadSettings([[maybe_unused]] JNIEnv* env, +void Java_org_yuzu_yuzu_1emu_NativeLibrary_reloadSettings([[maybe_unused]] JNIEnv* env, [[maybe_unused]] jclass clazz) { Config{}; } -jstring Java_org_yuzu_yuzu_1emu_NativeLibrary_GetUserSetting([[maybe_unused]] JNIEnv* env, +jstring Java_org_yuzu_yuzu_1emu_NativeLibrary_getUserSetting([[maybe_unused]] JNIEnv* env, [[maybe_unused]] jclass clazz, jstring j_game_id, jstring j_section, jstring j_key) { @@ -575,7 +570,7 @@ jstring Java_org_yuzu_yuzu_1emu_NativeLibrary_GetUserSetting([[maybe_unused]] JN return env->NewStringUTF(""); } -void Java_org_yuzu_yuzu_1emu_NativeLibrary_SetUserSetting([[maybe_unused]] JNIEnv* env, +void Java_org_yuzu_yuzu_1emu_NativeLibrary_setUserSetting([[maybe_unused]] JNIEnv* env, [[maybe_unused]] jclass clazz, jstring j_game_id, jstring j_section, jstring j_key, jstring j_value) { @@ -590,7 +585,7 @@ void Java_org_yuzu_yuzu_1emu_NativeLibrary_SetUserSetting([[maybe_unused]] JNIEn env->ReleaseStringUTFChars(j_value, value.data()); } -void Java_org_yuzu_yuzu_1emu_NativeLibrary_InitGameIni([[maybe_unused]] JNIEnv* env, +void Java_org_yuzu_yuzu_1emu_NativeLibrary_initGameIni([[maybe_unused]] JNIEnv* env, [[maybe_unused]] jclass clazz, jstring j_game_id) { std::string_view game_id = env->GetStringUTFChars(j_game_id, 0); @@ -598,7 +593,7 @@ void Java_org_yuzu_yuzu_1emu_NativeLibrary_InitGameIni([[maybe_unused]] JNIEnv* env->ReleaseStringUTFChars(j_game_id, game_id.data()); } -jdoubleArray Java_org_yuzu_yuzu_1emu_NativeLibrary_GetPerfStats([[maybe_unused]] JNIEnv* env, +jdoubleArray Java_org_yuzu_yuzu_1emu_NativeLibrary_getPerfStats([[maybe_unused]] JNIEnv* env, [[maybe_unused]] jclass clazz) { jdoubleArray j_stats = env->NewDoubleArray(4); @@ -615,10 +610,10 @@ jdoubleArray Java_org_yuzu_yuzu_1emu_NativeLibrary_GetPerfStats([[maybe_unused]] return j_stats; } -void Java_org_yuzu_yuzu_1emu_utils_DirectoryInitialization_SetSysDirectory( +void Java_org_yuzu_yuzu_1emu_utils_DirectoryInitialization_setSysDirectory( [[maybe_unused]] JNIEnv* env, [[maybe_unused]] jclass clazz, jstring j_path) {} -void Java_org_yuzu_yuzu_1emu_NativeLibrary_Run__Ljava_lang_String_2([[maybe_unused]] JNIEnv* env, +void Java_org_yuzu_yuzu_1emu_NativeLibrary_run__Ljava_lang_String_2([[maybe_unused]] JNIEnv* env, [[maybe_unused]] jclass clazz, jstring j_path) { const std::string path = GetJString(env, j_path); @@ -630,19 +625,19 @@ void Java_org_yuzu_yuzu_1emu_NativeLibrary_Run__Ljava_lang_String_2([[maybe_unus } } -void Java_org_yuzu_yuzu_1emu_NativeLibrary_LogDeviceInfo([[maybe_unused]] JNIEnv* env, +void Java_org_yuzu_yuzu_1emu_NativeLibrary_logDeviceInfo([[maybe_unused]] JNIEnv* env, [[maybe_unused]] jclass clazz) { LOG_INFO(Frontend, "yuzu Version: {}-{}", Common::g_scm_branch, Common::g_scm_desc); LOG_INFO(Frontend, "Host OS: Android API level {}", android_get_device_api_level()); } -void Java_org_yuzu_yuzu_1emu_NativeLibrary_SubmitInlineKeyboardText(JNIEnv* env, jclass clazz, +void Java_org_yuzu_yuzu_1emu_NativeLibrary_submitInlineKeyboardText(JNIEnv* env, jclass clazz, jstring j_text) { const std::u16string input = Common::UTF8ToUTF16(GetJString(env, j_text)); EmulationSession::GetInstance().SoftwareKeyboard()->SubmitInlineKeyboardText(input); } -void Java_org_yuzu_yuzu_1emu_NativeLibrary_SubmitInlineKeyboardInput(JNIEnv* env, jclass clazz, +void Java_org_yuzu_yuzu_1emu_NativeLibrary_submitInlineKeyboardInput(JNIEnv* env, jclass clazz, jint j_key_code) { EmulationSession::GetInstance().SoftwareKeyboard()->SubmitInlineKeyboardInput(j_key_code); }