|
|
@@ -1,170 +1,170 @@ |
|
|
// Copyright 2018 Dolphin Emulator Project |
|
|
// Licensed under GPLv2+ |
|
|
// Refer to the license.txt file included. |
|
|
|
|
|
#include "jni/AndroidCommon/IDCache.h" |
|
|
|
|
|
#include <jni.h> |
|
|
|
|
|
static constexpr jint JNI_VERSION = JNI_VERSION_1_6; |
|
|
|
|
|
static JavaVM* s_java_vm; |
|
|
|
|
|
static jclass s_native_library_class; |
|
|
static jmethodID s_display_alert_msg; |
|
|
static jmethodID s_get_update_touch_pointer; |
|
|
|
|
|
static jclass s_game_file_class; |
|
|
static jfieldID s_game_file_pointer; |
|
|
static jmethodID s_game_file_constructor; |
|
|
|
|
|
static jclass s_game_file_cache_class; |
|
|
static jfieldID s_game_file_cache_pointer; |
|
|
|
|
|
static jclass s_analytics_class; |
|
|
static jmethodID s_send_analytics_report; |
|
|
static jmethodID s_get_analytics_value; |
|
|
|
|
|
static jmethodID s_do_rumble; |
|
|
|
|
|
namespace IDCache |
|
|
{ |
|
|
JNIEnv* GetEnvForThread() |
|
|
{ |
|
|
thread_local static struct OwnedEnv |
|
|
{ |
|
|
OwnedEnv() |
|
|
{ |
|
|
status = s_java_vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6); |
|
|
if (status == JNI_EDETACHED) |
|
|
s_java_vm->AttachCurrentThread(&env, nullptr); |
|
|
} |
|
|
|
|
|
~OwnedEnv() |
|
|
{ |
|
|
if (status == JNI_EDETACHED) |
|
|
s_java_vm->DetachCurrentThread(); |
|
|
} |
|
|
|
|
|
int status; |
|
|
JNIEnv* env = nullptr; |
|
|
} owned; |
|
|
return owned.env; |
|
|
} |
|
|
|
|
|
jclass GetNativeLibraryClass() |
|
|
{ |
|
|
return s_native_library_class; |
|
|
} |
|
|
|
|
|
jmethodID GetDisplayAlertMsg() |
|
|
{ |
|
|
return s_display_alert_msg; |
|
|
} |
|
|
|
|
|
jmethodID GetUpdateTouchPointer() |
|
|
{ |
|
|
return s_get_update_touch_pointer; |
|
|
} |
|
|
|
|
|
jclass GetAnalyticsClass() |
|
|
{ |
|
|
return s_analytics_class; |
|
|
} |
|
|
|
|
|
jmethodID GetSendAnalyticsReport() |
|
|
{ |
|
|
return s_send_analytics_report; |
|
|
} |
|
|
|
|
|
jmethodID GetAnalyticsValue() |
|
|
{ |
|
|
return s_get_analytics_value; |
|
|
} |
|
|
jclass GetGameFileClass() |
|
|
{ |
|
|
return s_game_file_class; |
|
|
} |
|
|
|
|
|
jfieldID GetGameFilePointer() |
|
|
{ |
|
|
return s_game_file_pointer; |
|
|
} |
|
|
|
|
|
jmethodID GetGameFileConstructor() |
|
|
{ |
|
|
return s_game_file_constructor; |
|
|
} |
|
|
|
|
|
jclass GetGameFileCacheClass() |
|
|
{ |
|
|
return s_game_file_cache_class; |
|
|
} |
|
|
|
|
|
jfieldID GetGameFileCachePointer() |
|
|
{ |
|
|
return s_game_file_cache_pointer; |
|
|
} |
|
|
|
|
|
jmethodID GetDoRumble() |
|
|
{ |
|
|
return s_do_rumble; |
|
|
} |
|
|
|
|
|
} // namespace IDCache |
|
|
|
|
|
#ifdef __cplusplus |
|
|
extern "C" { |
|
|
#endif |
|
|
|
|
|
jint JNI_OnLoad(JavaVM* vm, void* reserved) |
|
|
{ |
|
|
s_java_vm = vm; |
|
|
|
|
|
JNIEnv* env; |
|
|
if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION) != JNI_OK) |
|
|
return JNI_ERR; |
|
|
|
|
|
const jclass native_library_class = env->FindClass("org/dolphinemu/dolphinemu/NativeLibrary"); |
|
|
s_native_library_class = reinterpret_cast<jclass>(env->NewGlobalRef(native_library_class)); |
|
|
s_display_alert_msg = env->GetStaticMethodID(s_native_library_class, "displayAlertMsg", |
|
|
"(Ljava/lang/String;Ljava/lang/String;Z)Z"); |
|
|
s_do_rumble = env->GetStaticMethodID(s_native_library_class, "rumble", "(ID)V"); |
|
|
s_get_update_touch_pointer = |
|
|
env->GetStaticMethodID(s_native_library_class, "updateTouchPointer", "()V"); |
|
|
|
|
|
const jclass game_file_class = env->FindClass("org/dolphinemu/dolphinemu/model/GameFile"); |
|
|
s_game_file_class = reinterpret_cast<jclass>(env->NewGlobalRef(game_file_class)); |
|
|
s_game_file_pointer = env->GetFieldID(game_file_class, "mPointer", "J"); |
|
|
s_game_file_constructor = env->GetMethodID(game_file_class, "<init>", "(J)V"); |
|
|
|
|
|
const jclass game_file_cache_class = |
|
|
env->FindClass("org/dolphinemu/dolphinemu/model/GameFileCache"); |
|
|
s_game_file_cache_class = reinterpret_cast<jclass>(env->NewGlobalRef(game_file_cache_class)); |
|
|
s_game_file_cache_pointer = env->GetFieldID(game_file_cache_class, "mPointer", "J"); |
|
|
|
|
|
const jclass analytics_class = env->FindClass("org/dolphinemu/dolphinemu/utils/Analytics"); |
|
|
s_analytics_class = reinterpret_cast<jclass>(env->NewGlobalRef(analytics_class)); |
|
|
s_send_analytics_report = |
|
|
env->GetStaticMethodID(s_analytics_class, "sendReport", "(Ljava/lang/String;[B)V"); |
|
|
s_get_analytics_value = env->GetStaticMethodID(s_analytics_class, "getValue", |
|
|
"(Ljava/lang/String;)Ljava/lang/String;"); |
|
|
|
|
|
return JNI_VERSION; |
|
|
} |
|
|
|
|
|
void JNI_OnUnload(JavaVM* vm, void* reserved) |
|
|
{ |
|
|
JNIEnv* env; |
|
|
if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION) != JNI_OK) |
|
|
return; |
|
|
|
|
|
env->DeleteGlobalRef(s_native_library_class); |
|
|
env->DeleteGlobalRef(s_game_file_class); |
|
|
env->DeleteGlobalRef(s_game_file_cache_class); |
|
|
env->DeleteGlobalRef(s_analytics_class); |
|
|
} |
|
|
|
|
|
#ifdef __cplusplus |
|
|
} |
|
|
#endif |
|
|
// Copyright 2018 Dolphin Emulator Project |
|
|
// Licensed under GPLv2+ |
|
|
// Refer to the license.txt file included. |
|
|
|
|
|
#include "jni/AndroidCommon/IDCache.h" |
|
|
|
|
|
#include <jni.h> |
|
|
|
|
|
static constexpr jint JNI_VERSION = JNI_VERSION_1_6; |
|
|
|
|
|
static JavaVM* s_java_vm; |
|
|
|
|
|
static jclass s_native_library_class; |
|
|
static jmethodID s_display_alert_msg; |
|
|
static jmethodID s_get_update_touch_pointer; |
|
|
|
|
|
static jclass s_game_file_class; |
|
|
static jfieldID s_game_file_pointer; |
|
|
static jmethodID s_game_file_constructor; |
|
|
|
|
|
static jclass s_game_file_cache_class; |
|
|
static jfieldID s_game_file_cache_pointer; |
|
|
|
|
|
static jclass s_analytics_class; |
|
|
static jmethodID s_send_analytics_report; |
|
|
static jmethodID s_get_analytics_value; |
|
|
|
|
|
static jmethodID s_do_rumble; |
|
|
|
|
|
namespace IDCache |
|
|
{ |
|
|
JNIEnv* GetEnvForThread() |
|
|
{ |
|
|
thread_local static struct OwnedEnv |
|
|
{ |
|
|
OwnedEnv() |
|
|
{ |
|
|
status = s_java_vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6); |
|
|
if (status == JNI_EDETACHED) |
|
|
s_java_vm->AttachCurrentThread(&env, nullptr); |
|
|
} |
|
|
|
|
|
~OwnedEnv() |
|
|
{ |
|
|
if (status == JNI_EDETACHED) |
|
|
s_java_vm->DetachCurrentThread(); |
|
|
} |
|
|
|
|
|
int status; |
|
|
JNIEnv* env = nullptr; |
|
|
} owned; |
|
|
return owned.env; |
|
|
} |
|
|
|
|
|
jclass GetNativeLibraryClass() |
|
|
{ |
|
|
return s_native_library_class; |
|
|
} |
|
|
|
|
|
jmethodID GetDisplayAlertMsg() |
|
|
{ |
|
|
return s_display_alert_msg; |
|
|
} |
|
|
|
|
|
jmethodID GetUpdateTouchPointer() |
|
|
{ |
|
|
return s_get_update_touch_pointer; |
|
|
} |
|
|
|
|
|
jclass GetAnalyticsClass() |
|
|
{ |
|
|
return s_analytics_class; |
|
|
} |
|
|
|
|
|
jmethodID GetSendAnalyticsReport() |
|
|
{ |
|
|
return s_send_analytics_report; |
|
|
} |
|
|
|
|
|
jmethodID GetAnalyticsValue() |
|
|
{ |
|
|
return s_get_analytics_value; |
|
|
} |
|
|
jclass GetGameFileClass() |
|
|
{ |
|
|
return s_game_file_class; |
|
|
} |
|
|
|
|
|
jfieldID GetGameFilePointer() |
|
|
{ |
|
|
return s_game_file_pointer; |
|
|
} |
|
|
|
|
|
jmethodID GetGameFileConstructor() |
|
|
{ |
|
|
return s_game_file_constructor; |
|
|
} |
|
|
|
|
|
jclass GetGameFileCacheClass() |
|
|
{ |
|
|
return s_game_file_cache_class; |
|
|
} |
|
|
|
|
|
jfieldID GetGameFileCachePointer() |
|
|
{ |
|
|
return s_game_file_cache_pointer; |
|
|
} |
|
|
|
|
|
jmethodID GetDoRumble() |
|
|
{ |
|
|
return s_do_rumble; |
|
|
} |
|
|
|
|
|
} // namespace IDCache |
|
|
|
|
|
#ifdef __cplusplus |
|
|
extern "C" { |
|
|
#endif |
|
|
|
|
|
jint JNI_OnLoad(JavaVM* vm, void* reserved) |
|
|
{ |
|
|
s_java_vm = vm; |
|
|
|
|
|
JNIEnv* env; |
|
|
if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION) != JNI_OK) |
|
|
return JNI_ERR; |
|
|
|
|
|
const jclass native_library_class = env->FindClass("org/dolphinemu/dolphinemu/NativeLibrary"); |
|
|
s_native_library_class = reinterpret_cast<jclass>(env->NewGlobalRef(native_library_class)); |
|
|
s_display_alert_msg = env->GetStaticMethodID(s_native_library_class, "displayAlertMsg", |
|
|
"(Ljava/lang/String;Ljava/lang/String;Z)Z"); |
|
|
s_do_rumble = env->GetStaticMethodID(s_native_library_class, "rumble", "(ID)V"); |
|
|
s_get_update_touch_pointer = |
|
|
env->GetStaticMethodID(s_native_library_class, "updateTouchPointer", "()V"); |
|
|
|
|
|
const jclass game_file_class = env->FindClass("org/dolphinemu/dolphinemu/model/GameFile"); |
|
|
s_game_file_class = reinterpret_cast<jclass>(env->NewGlobalRef(game_file_class)); |
|
|
s_game_file_pointer = env->GetFieldID(game_file_class, "mPointer", "J"); |
|
|
s_game_file_constructor = env->GetMethodID(game_file_class, "<init>", "(J)V"); |
|
|
|
|
|
const jclass game_file_cache_class = |
|
|
env->FindClass("org/dolphinemu/dolphinemu/model/GameFileCache"); |
|
|
s_game_file_cache_class = reinterpret_cast<jclass>(env->NewGlobalRef(game_file_cache_class)); |
|
|
s_game_file_cache_pointer = env->GetFieldID(game_file_cache_class, "mPointer", "J"); |
|
|
|
|
|
const jclass analytics_class = env->FindClass("org/dolphinemu/dolphinemu/utils/Analytics"); |
|
|
s_analytics_class = reinterpret_cast<jclass>(env->NewGlobalRef(analytics_class)); |
|
|
s_send_analytics_report = |
|
|
env->GetStaticMethodID(s_analytics_class, "sendReport", "(Ljava/lang/String;[B)V"); |
|
|
s_get_analytics_value = env->GetStaticMethodID(s_analytics_class, "getValue", |
|
|
"(Ljava/lang/String;)Ljava/lang/String;"); |
|
|
|
|
|
return JNI_VERSION; |
|
|
} |
|
|
|
|
|
void JNI_OnUnload(JavaVM* vm, void* reserved) |
|
|
{ |
|
|
JNIEnv* env; |
|
|
if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION) != JNI_OK) |
|
|
return; |
|
|
|
|
|
env->DeleteGlobalRef(s_native_library_class); |
|
|
env->DeleteGlobalRef(s_game_file_class); |
|
|
env->DeleteGlobalRef(s_game_file_cache_class); |
|
|
env->DeleteGlobalRef(s_analytics_class); |
|
|
} |
|
|
|
|
|
#ifdef __cplusplus |
|
|
} |
|
|
#endif |