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