From ab6fafb6ebe1fcc6e99e18f96cb4870c1a1937c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Wed, 4 Jan 2023 16:07:39 +0100 Subject: [PATCH] Invert dependency to avoid compile issues --- Common/Thread/ThreadUtil.cpp | 38 ++++++++++++++++++++---------------- Common/Thread/ThreadUtil.h | 4 ++++ android/README.TXT | 14 +++++++++++++ android/jni/app-android.cpp | 34 +++++++++++++++++--------------- android/jni/app-android.h | 3 --- 5 files changed, 57 insertions(+), 36 deletions(-) diff --git a/Common/Thread/ThreadUtil.cpp b/Common/Thread/ThreadUtil.cpp index 0e3716d6b6..338dfa1a86 100644 --- a/Common/Thread/ThreadUtil.cpp +++ b/Common/Thread/ThreadUtil.cpp @@ -28,6 +28,27 @@ #include "Common/Thread/ThreadUtil.h" #include "Common/Data/Encoding/Utf8.h" +AttachDetachFunc g_attach; +AttachDetachFunc g_detach; + +void AttachThreadToJNI() { + if (g_attach) { + g_attach(); + } +} + + +void DetachThreadFromJNI() { + if (g_detach) { + g_detach(); + } +} + +void RegisterAttachDetach(AttachDetachFunc attach, AttachDetachFunc detach) { + g_attach = attach; + g_detach = detach; +} + #if (PPSSPP_PLATFORM(ANDROID) || PPSSPP_PLATFORM(LINUX)) && !defined(_GNU_SOURCE) #define _GNU_SOURCE #endif @@ -67,23 +88,6 @@ static EXCEPTION_DISPOSITION NTAPI ignore_handler(EXCEPTION_RECORD *rec, } #endif -void AttachThreadToJNI() { -#if PPSSPP_PLATFORM(ANDROID) - Android_AttachThreadToJNI(); -#else - // Do nothing -#endif -} - - -void DetachThreadFromJNI() { -#if PPSSPP_PLATFORM(ANDROID) - Android_DetachThreadFromJNI(); -#else - // Do nothing -#endif -} - #if PPSSPP_PLATFORM(WINDOWS) && !PPSSPP_PLATFORM(UWP) typedef HRESULT (WINAPI *TSetThreadDescription)(HANDLE, PCWSTR); diff --git a/Common/Thread/ThreadUtil.h b/Common/Thread/ThreadUtil.h index d6c6e60c84..6bab7d13e2 100644 --- a/Common/Thread/ThreadUtil.h +++ b/Common/Thread/ThreadUtil.h @@ -14,6 +14,10 @@ const char *GetCurrentThreadName(); // exactly what it is is badly specified and not useful for anything. int GetCurrentThreadIdForDebug(); +typedef void (*AttachDetachFunc)(); + +void RegisterAttachDetach(AttachDetachFunc attach, AttachDetachFunc detach); + // When you know that a thread potentially will make JNI calls, call this after setting its name. void AttachThreadToJNI(); diff --git a/android/README.TXT b/android/README.TXT index d8d734f3db..082844e7aa 100644 --- a/android/README.TXT +++ b/android/README.TXT @@ -1,6 +1,20 @@ +================================================================ + +NOTE: These are legacy instructions for building using ndk-build. + +We mostly only use this on CI because it's faster than gradle. +There might also be some holdouts around still using eclipse. + +================================================================ + First, build the C++ static library: + > cd android > ./ab.sh +Or +> ./ab.cmd + +as appropriate. Start Eclipse, import the android directory as an existing project You need to also load the "native" project into your eclipse workspace diff --git a/android/jni/app-android.cpp b/android/jni/app-android.cpp index 15290ddf43..855ce4d51e 100644 --- a/android/jni/app-android.cpp +++ b/android/jni/app-android.cpp @@ -246,22 +246,6 @@ jclass findClass(const char* name) { return static_cast(getEnv()->CallObjectMethod(gClassLoader, gFindClassMethod, getEnv()->NewStringUTF(name))); } -JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *pjvm, void *reserved) { - INFO_LOG(SYSTEM, "JNI_OnLoad"); - gJvm = pjvm; // cache the JavaVM pointer - auto env = getEnv(); - //replace with one of your classes in the line below - auto randomClass = env->FindClass("org/ppsspp/ppsspp/NativeActivity"); - jclass classClass = env->GetObjectClass(randomClass); - auto classLoaderClass = env->FindClass("java/lang/ClassLoader"); - auto getClassLoaderMethod = env->GetMethodID(classClass, "getClassLoader", - "()Ljava/lang/ClassLoader;"); - gClassLoader = env->NewGlobalRef(env->CallObjectMethod(randomClass, getClassLoaderMethod)); - gFindClassMethod = env->GetMethodID(classLoaderClass, "findClass", - "(Ljava/lang/String;)Ljava/lang/Class;"); - return JNI_VERSION_1_6; -} - void Android_AttachThreadToJNI() { JNIEnv *env; int status = gJvm->GetEnv((void **)&env, JNI_VERSION_1_6); @@ -289,6 +273,24 @@ void Android_DetachThreadFromJNI() { } } +JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *pjvm, void *reserved) { + INFO_LOG(SYSTEM, "JNI_OnLoad"); + gJvm = pjvm; // cache the JavaVM pointer + auto env = getEnv(); + //replace with one of your classes in the line below + auto randomClass = env->FindClass("org/ppsspp/ppsspp/NativeActivity"); + jclass classClass = env->GetObjectClass(randomClass); + auto classLoaderClass = env->FindClass("java/lang/ClassLoader"); + auto getClassLoaderMethod = env->GetMethodID(classClass, "getClassLoader", + "()Ljava/lang/ClassLoader;"); + gClassLoader = env->NewGlobalRef(env->CallObjectMethod(randomClass, getClassLoaderMethod)); + gFindClassMethod = env->GetMethodID(classLoaderClass, "findClass", + "(Ljava/lang/String;)Ljava/lang/Class;"); + + RegisterAttachDetach(&Android_AttachThreadToJNI, &Android_DetachThreadFromJNI); + return JNI_VERSION_1_6; +} + // Only used in OpenGL mode. static void EmuThreadFunc() { JNIEnv *env; diff --git a/android/jni/app-android.h b/android/jni/app-android.h index 0dc6c03123..d2d7957dcb 100644 --- a/android/jni/app-android.h +++ b/android/jni/app-android.h @@ -27,8 +27,5 @@ public: }; #endif -void Android_AttachThreadToJNI(); -void Android_DetachThreadFromJNI(); - #endif