From 18b7de64b126fd19bbe7a976e543db6d5ef657b1 Mon Sep 17 00:00:00 2001 From: Mykhailo Diachenko <55983336+diachenko-mischa@users.noreply.github.com> Date: Mon, 29 Jul 2024 14:31:35 +0300 Subject: [PATCH] HERESDK-3466: Preserve thread name after attaching it to JVM (#1597) * HERESDK-3466: Preserve thread name after attaching it to JVM When native thread is attached to JVM, then it's name is taken from `JavaVMAttachArgs`. When no `JavaVMAttachArgs`, or no `JavaVMAttachArgs::name` passed, then JVM on its own decides on taming thread. Those names are not descriptive. To preserve thread name, pass the currently set thread name in `JavaVMAttachArgs::name`. `pthread_getname_np` was introduced in API 26, hence use more generic approach. --------- Signed-off-by: Mykhailo Diachenko --- .../jni/utils/JniBaseImplementation.mustache | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/gluecodium/src/main/resources/templates/jni/utils/JniBaseImplementation.mustache b/gluecodium/src/main/resources/templates/jni/utils/JniBaseImplementation.mustache index 69bfede7b4..6d190fc3f2 100644 --- a/gluecodium/src/main/resources/templates/jni/utils/JniBaseImplementation.mustache +++ b/gluecodium/src/main/resources/templates/jni/utils/JniBaseImplementation.mustache @@ -32,6 +32,18 @@ static JavaVM* jvm; static pthread_key_t s_thread_key; +char *get_thread_name() +{ +#ifdef __ANDROID__ + thread_local char name[17] = {0}; + if (prctl(PR_GET_NAME, name) == 0) + { + return name; + } +#endif + return nullptr; +} + JNIEnv* attach_current_thread( ) { @@ -39,10 +51,14 @@ attach_current_thread( ) int envState = jvm->GetEnv( reinterpret_cast< void** >( &jniEnv ), JNI_VERSION_1_6 ); if ( envState == JNI_EDETACHED ) { + JavaVMAttachArgs args; + args.version = JNI_VERSION_1_6; + args.group = NULL; + args.name = get_thread_name(); #ifdef __ANDROID__ - jvm->AttachCurrentThread( &jniEnv, nullptr ); + jvm->AttachCurrentThread( &jniEnv, &args ); #else // ifdef __ANDROID__ - jvm->AttachCurrentThread( reinterpret_cast< void** >( &jniEnv ), nullptr ); + jvm->AttachCurrentThread( reinterpret_cast< void** >( &jniEnv ), &args ); #endif // ifdef __ANDROID__ }