Browse Source
trying to add open android web browser, basically took swkb as template
pull/3308/head
trying to add open android web browser, basically took swkb as template
pull/3308/head
7 changed files with 135 additions and 2 deletions
-
11src/android/app/src/main/java/org/yuzu/yuzu_emu/NativeLibrary.kt
-
35src/android/app/src/main/java/org/yuzu/yuzu_emu/applets/web/WebBrowser.kt
-
4src/android/app/src/main/jni/native.cpp
-
4src/common/CMakeLists.txt
-
50src/common/android/applets/web_browser.cpp
-
30src/common/android/applets/web_browser.h
-
3src/common/android/id_cache.cpp
@ -0,0 +1,35 @@ |
|||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project |
|||
// SPDX-License-Identifier: GPL-3.0-or-later |
|||
|
|||
package org.yuzu.yuzu_emu.applets.web |
|||
|
|||
import android.content.Intent |
|||
import android.net.Uri |
|||
import androidx.annotation.Keep |
|||
import org.yuzu.yuzu_emu.NativeLibrary |
|||
import org.yuzu.yuzu_emu.utils.Log |
|||
|
|||
/** |
|||
Should run WebBrowser as a new intent. |
|||
*/ |
|||
|
|||
@Keep |
|||
object WebBrowser { |
|||
@JvmStatic |
|||
fun openExternal(url: String) { |
|||
val activity = NativeLibrary.sEmulationActivity.get() ?: run { |
|||
return |
|||
} |
|||
|
|||
activity.runOnUiThread { |
|||
try { |
|||
val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url)).apply { |
|||
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) |
|||
} |
|||
activity.startActivity(intent) |
|||
} catch (e: Exception) { |
|||
Log.error("WebBrowser failed to launch $url: ${e.message}") |
|||
} |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,50 @@ |
|||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
|||
// SPDX-License-Identifier: GPL-3.0-or-later
|
|||
|
|||
#include "common/android/android_common.h"
|
|||
#include "common/android/id_cache.h"
|
|||
#include "common/android/applets/web_browser.h"
|
|||
#include "common/logging/log.h"
|
|||
|
|||
static jclass s_native_library_class = nullptr; |
|||
static jmethodID s_open_external_url = nullptr; |
|||
|
|||
namespace Common::Android::WebBrowser { |
|||
|
|||
void InitJNI(JNIEnv* env) { |
|||
const jclass local = env->FindClass("org/yuzu/yuzu_emu/NativeLibrary"); |
|||
s_native_library_class = static_cast<jclass>(env->NewGlobalRef(local)); |
|||
env->DeleteLocalRef(local); |
|||
s_open_external_url = env->GetStaticMethodID(s_native_library_class, "openExternalUrl", "(Ljava/lang/String;)V"); |
|||
} |
|||
|
|||
void CleanupJNI(JNIEnv* env) { |
|||
if (s_native_library_class != nullptr) { |
|||
env->DeleteGlobalRef(s_native_library_class); |
|||
s_native_library_class = nullptr; |
|||
} |
|||
s_open_external_url = nullptr; |
|||
} |
|||
|
|||
void AndroidWebBrowser::OpenLocalWebPage(const std::string& local_url, ExtractROMFSCallback extract_romfs_callback, OpenWebPageCallback callback) const { |
|||
LOG_WARNING(Frontend, "(STUBBED)"); |
|||
callback(Service::AM::Frontend::WebExitReason::WindowClosed, ""); |
|||
} |
|||
|
|||
void AndroidWebBrowser::OpenExternalWebPage(const std::string& external_url, OpenWebPageCallback callback) const { |
|||
// do a dedicated thread, calling from the this thread crashed CPU fiber.
|
|||
Common::Android::RunJNIOnFiber<void>([&](JNIEnv* env) { |
|||
if (env != nullptr && s_native_library_class != nullptr && s_open_external_url != nullptr) { |
|||
const jstring j_url = Common::Android::ToJString(env, external_url); |
|||
env->CallStaticVoidMethod(s_native_library_class, s_open_external_url, j_url); |
|||
env->DeleteLocalRef(j_url); |
|||
} else { |
|||
LOG_ERROR(Frontend, "JNI not initialized, cannot open {}", external_url); |
|||
} |
|||
return; |
|||
}); |
|||
|
|||
callback(Service::AM::Frontend::WebExitReason::WindowClosed, external_url); |
|||
} |
|||
|
|||
} // namespace Common::Android::WebBrowser
|
|||
@ -0,0 +1,30 @@ |
|||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project |
|||
// SPDX-License-Identifier: GPL-3.0-or-later |
|||
|
|||
#pragma once |
|||
|
|||
#include <jni.h> |
|||
#include <string> |
|||
|
|||
#include "core/frontend/applets/web_browser.h" |
|||
|
|||
namespace Common::Android::WebBrowser { |
|||
|
|||
class AndroidWebBrowser final : public Core::Frontend::WebBrowserApplet { |
|||
public: |
|||
~AndroidWebBrowser() override = default; |
|||
|
|||
void Close() const override {} |
|||
|
|||
void OpenLocalWebPage(const std::string& local_url, |
|||
ExtractROMFSCallback extract_romfs_callback, |
|||
OpenWebPageCallback callback) const override; |
|||
|
|||
void OpenExternalWebPage(const std::string& external_url, |
|||
OpenWebPageCallback callback) const override; |
|||
}; |
|||
|
|||
void InitJNI(JNIEnv* env); |
|||
void CleanupJNI(JNIEnv* env); |
|||
|
|||
} // namespace Common::Android::WebBrowser |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue