美文网首页
解决JNI线程pthread_setname_np无效问题

解决JNI线程pthread_setname_np无效问题

作者: 偶是星爷 | 来源:发表于2019-07-24 20:14 被阅读0次

C/C++都是使用pthread方法创建线程,这些线程和Java里的线程是不同,它们没有JVM环境。通常的做法是通过 AttachCurrentThread 方法将当前线程附着到 Java 虚拟机上。

但是这些线程附着后,原来通过pthread_setname_np设置的线程名都无效了,取而代之的是Thread-xxx这类系统命名。

线程名可以通过lldb的bt all命令看到

为了弄清原因,我们看一下AttachCurrentThread的文档说明:

https://docs.oracle.com/javase/1.5.0/docs/guide/jni/spec/invocation.html

jint AttachCurrentThread(JavaVM *vm, JNIEnv **p_env, void *thr_args);

Attaches the current thread to a Java VM. Returns a JNI interface pointer in the JNIEnv argument.

Trying to attach a thread that is already attached is a no-op.

A native thread cannot be attached simultaneously to two Java VMs.

When a thread is attached to the VM, the context class loader is the bootstrap loader.

LINKAGE:
Index 4 in the JavaVM interface function table.

PARAMETERS:
vm: the VM to which the current thread will be attached.

p_env: pointer to the location where the JNI interface pointer of the current thread will be placed.

thr_args: VM-specific thread attachment arguments.

In JDK 1.1, the second argument to AttachCurrentThread is always a pointer to JNIEnv. The third argument to AttachCurrentThread was reserved, and should be set to NULL.

In the JDK, you pass NULL as the third argument for 1.1 behavior, or pass a pointer to the following structure to specify additional information:

typedef struct JavaVMAttachArgs {
    jint version;  /* must be JNI_VERSION_1_2 */
    char *name;    /* the name of the thread as a modified UTF-8 string, or NULL */
    jobject group; /* global ref of a ThreadGroup object, or NULL */
} JavaVMAttachArgs
RETURNS:
Returns “0” on success; returns a negative number on failure.

thr_args用于设置VM相关的线程名,我们之所以以前设置的线程名失效,主要是在Attached的时候没有给它赋值。
正确的代码应该是:

#include <linux/prctl.h>
#include <sys/prctl.h>

char thread_name[128] = {0};
prctl(PR_GET_NAME, (char *)(thread_name));
JavaVMAttachArgs args;
args.version = JNI_VERSION_1_4;  // version值请参考你的NDK,必须大于JNI_VERSION_1_2
args.name = (char *)thread_name;
args.group = NULL;

if ((*jvm)->AttachCurrentThread(jvm, &env, (void*)&args) == JNI_OK) {
}

另外,pthread_setname_np的名字不能超过16字节,所以请不要设一个太长的名字。

https://android.googlesource.com/platform/bionic/+/40eabe2/libc/bionic/pthread_setname_np.cpp

相关文章

  • 解决JNI线程pthread_setname_np无效问题

    C/C++都是使用pthread方法创建线程,这些线程和Java里的线程是不同,它们没有JVM环境。通常的做法是通...

  • linux手册翻译——pthread_setname_np(3)

    pthread_setname_np, pthread_getname_np :设置/获取线程的名称 编译和链接需...

  • JNI入门了解

    什么是JNI? JNI Java Native Interface java本地接口 JNI 能够解决什么问题? ...

  • 3-ndk学习之jni基础篇(3)

    jni多线程操作 这里的效果是在jni中开启子线程,然后在子线程直接调用Activity的方法jni中,jvm是跨...

  • JNI引用管理

    JNI中有四种引用类型,JNIInvalidRefType无效引用,JNILocalRefType本地引用,JNI...

  • 小程序开发中遇到的那些坑

    解决1px无效果的问题; 解决 scroll-view 横向滑动无效的问题; 利用 background-imag...

  • 为知笔记外链分享

    Holder演化之路JNI开发小结JNI解决密钥硬编码问题 优化相关 lint代码review与优化WebView...

  • 八、JNI-JNI补充功能

    JNI和线程 注册本地方法 #1. JNI和线程 1.1 规约 当编写JNI函数时,有如下规约是必须要遵守的: J...

  • RxJava响应式编程

    常用名词说明 Schedulers(调度器) 解决Android主线程问题; 解决多线程线程问题 Observab...

  • 线程的基本语法

    线程同步[解决线程安全问题] 解决线程安全问题 线程同步方式一:同步代码 语法基本 synchronized (同...

网友评论

      本文标题:解决JNI线程pthread_setname_np无效问题

      本文链接:https://www.haomeiwen.com/subject/sbifrctx.html