NDK/JNI:如何识别当前线程

7
在JNI本地方法中,是否有一种方法可以在不调用Java回调的情况下知道当前线程的ID?线程本地存储也可以使用。
编辑:pthread.h存在于NDK include文件夹中...有人知道Java线程是否对应于NDK实现中的POSIX线程吗?
1个回答

5
你对哪个ID感兴趣?Dalvik线程转储包括以下内容:
"main" prio=5 tid=1 TIMED_WAIT | group="main" sCount=1 dsCount=0 obj=0x40017730 self=0x12798 | sysTid=3167 nice=0 sched=0/0 cgrp=default handle=-2146114456 | schedstat=( 358850000 275073000 869 ) utm=23 stm=12 core=0
"tid"是VM的ID。 "handle"是pthread_t。 "sysTid"是gettid()的结果(Linux进程ID)。 libcore线程ID(从java.lang.Thread.getId()获取)未显示。
(您可以使用“adb shell kill -3”获得上述输出。输出将发送到由dalvik.vm.stack-trace-file属性定义的公共文件中-通常为/data/anr/traces.txt,但因设备而异。)
编辑:每个Dalvik VM线程都是Linux pthread。 gettid()系统调用将为每个线程提供唯一的ID。 另外,您可以在java.lang.Thread或pthread_key中向TLS添加标识信息。

我主要关心的是有一些操作不应该在除了主线程之外的线程上执行。如果(!(当前正在执行的JNI方法是从工作Java线程调用的)){仅限主线程位}。 - Seva Alekseyev
虚拟机不会给“主”线程任何特殊待遇。您可以通过检查gettid() == getpid()来获得近似值,即它是Linux进程的主线程,但这并不保证,并且将来可能会出现问题。更好的计划是让应用程序UI线程在线程本地存储(java.lang.Thread或pthread TLS)中设置一个值并进行检查。 - fadden
1
那么java.lang.Threads和pthreads是对应的吗?谢谢。请将这个知识点放入你的回答中,我会接受。ADB指南对我毫无关系 - 我正在尝试以编程方式完成它。 - Seva Alekseyev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接