summaryrefslogtreecommitdiff
path: root/Source/Android/jni/AndroidCommon/IDCache.cpp
diff options
context:
space:
mode:
authorweihuoya <zwdreams@gmail.com>2019-05-29 20:22:26 +0800
committerweihuoya <zwdreams@gmail.com>2019-05-29 20:22:26 +0800
commit0dec8feadb1c6ecca2de3764ccd413a8d950c573 (patch)
tree2cb6c81d03fa9caf848aa41c67abf89df90da306 /Source/Android/jni/AndroidCommon/IDCache.cpp
parent3132839113fde2078be4ee60bf8dbf5f15ce16cd (diff)
android: thread local env
Diffstat (limited to 'Source/Android/jni/AndroidCommon/IDCache.cpp')
-rw-r--r--Source/Android/jni/AndroidCommon/IDCache.cpp24
1 files changed, 21 insertions, 3 deletions
diff --git a/Source/Android/jni/AndroidCommon/IDCache.cpp b/Source/Android/jni/AndroidCommon/IDCache.cpp
index 71e2ae9d59..19b7147ba4 100644
--- a/Source/Android/jni/AndroidCommon/IDCache.cpp
+++ b/Source/Android/jni/AndroidCommon/IDCache.cpp
@@ -29,9 +29,27 @@ static jmethodID s_do_rumble;
namespace IDCache
{
-JavaVM* GetJavaVM()
-{
- return s_java_vm;
+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()