2011-04-21 2 views
6

JNI 고유 메소드에서 Java를 다시 호출하지 않고 현재 스레드의 ID를 알 수있는 방법이 있습니까? 스레드 로컬 저장소도 작동합니다.NDK/JNI : 현재 스레드 식별

EDIT : pthread.h는 NDK include 폴더에 존재합니다 ... Java 스레드가 NDK 구현에서 POSIX에 해당하는지 여부를 아는 사람이 있습니까?

답변

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이지만 장치에 따라 다릅니다.)

EDIT : 모든 Dalvik VM 스레드는 Linux pthread입니다. gettid() 시스템 호출은 각 스레드에 대한 고유 한 ID를 제공합니다. 또한, 식별 정보를 java.lang.Thread 또는 pthread_key의 TLS에 추가 할 수 있습니다.

+0

저는 주로 주 스레드 이외의 스레드에서 수행해서는 안되는 몇 가지 작업을 수행하는 데 관심이 있습니다. (! (현재 실행중인 JNI 메소드가 작업자 Java 스레드에서 호출되는 경우)) {주 스레드 전용 비트}. –

+0

VM은 "주"스레드에 어떤 종류의 우대를 제공하지 않습니다. gettid() == getpid()가 Linux 프로세스의 주 스레드인지 여부를 확인하여 근사값을 얻을 수 있지만, 이것이 보장되지는 않으며 앞으로 중단 될 수 있습니다. 더 좋은 계획은 앱 UI 스레드가 스레드 로컬 저장소 (java.lang.Thread 또는 pthread TLS)에 값을 설정하고이를 확인하는 것입니다. – fadden

+1

그래서 java.lang.Threads * DO *는 pthreads에 해당합니까? 감사. 지식의 덩어리를 당신의 대답으로 옮기면 받아 들일 것입니다. ADB 지침은 제 관련성이 없습니다. 프로그래밍 방식으로이 작업을 수행하려고합니다. –