本文共 854 字,大约阅读时间需要 2 分钟。
最近在native开发过程为了分析SDK使用线程情况,设置线程名过程中遇到了两个“坑”,故做下简单的总结记录同时跟大家分享一下。
注:这里的native线程,是指用使用pthread创建的线程或直接使用c++的std::thread类来创建新的线程,Andorid/linux上使用prctl(PR_SET_NAME, thread_name, 0, 0, 0)来设置线程名一般情况下我们native的线程是需要跟java层的模块交互的,由于native线程是没有JVM环境的,所以在在native线程操作java层的代码前,需要attched到JVM于便获取到线程的JVM环境,才能继续调用Java层的接口/代码。通常attched的代码如下
//G_JavaVM在JNI_OnLoad的时候缓存了G_JavaVM->AttachCurrentThread(&tmpEnv, NULL)// 第二个JavaVMAttachArgs 参数为NULL,之前设置的线程名会变成Thread-xxx这种名称
如果需要保持之前设置的线程名有效,需要配置JavaVMAttachArgs中的线程名,示例代码如下
//获取之前设置的线程名char thread_name[128] = {0};prctl(PR_GET_NAME, (char *)(thread_name));JavaVMAttachArgs args;args.version = JNI_VERSION_1_6;// 赋值到JavaVMAttachArgs的nameargs.name = (char *)thread_name;args.group = NULL;G_JavaVM->AttachCurrentThread(&tmpEnv, JavaVMAttachArgs)
不要设置太长的线程名,线程名的长度是16个字节,包括结束符’\0’,有效的长度是15个字节
转载地址:http://numbi.baihongyu.com/