2010-06-10 5 views
1

JNI를 통해 FFMPEG 바이너리 라이브러리를 사용하는 프로그램이 있습니다. 네이티브 코드에서 차단되는 URL을 열려면 호출이 필요하며 사용자가이 연결을 수동으로 취소 할 수 있도록 허용해야합니다. 가끔씩 Thread.interrupt()가 작동하는 것처럼 작동합니다 (연결하려는 URL이 "udp : // {whatever}"인 경우). 내 URL이 "rtp : // {whatever}"이면 Thread.interrupt()는 네이티브 스레드에 의해 존경받는 것처럼 보이지 않습니다. Thread.kill()은 그것을 수행하지 않는 것처럼 보입니다 (그리고 일반적으로 아무렇게나 뺨을 내미는).JNI를 통해 원시 스레드를 강제 종료 할 수있는 방법이 있습니까?

다른 사람이 JNI를 통해 기본 스레드를 인터럽트하거나 죽이는 방법을 알고 있습니까?

+0

확실하지 않지만 이것은 (다소 오래된) FFMPEG 버그와 관련이있다. https://roundup.ffmpeg.org/issue539 – user363420

답변

1

네이티브 코드는 Java 코드와 마찬가지로 스레드가 인터럽트되었는지 정기적으로 확인할 수 있습니다.

다른 접근법은 운영 체제에 따라 다르지만 스레드에 신호를 보내고 그 신호가 플래그를 설정할 수 있습니다. 이는 JNI 측에서 확인하는 것이 더 간단 할 수 있습니다.

모든 스레드 정지가 협력 - 당신은 Thread.interrupt() 또는 신호 처리기에 설정된 플래그를 통해 플래그를 (설정하여 정지 스레드에게 -.이 종종 스레드 코드 검사

+0

FFMPEG를 네이티브 라이브러리로 사용하고 있으며 가능하다면 네이티브 라이브러리를 변경하지 않도록하고 싶다. - 변경되지 않은 경우 모든 대상 플랫폼에 대해 직접 컴파일하지 않고 미리 빌드 된 바이너리를 사용할 수 있습니다. 저는 JNI 초보자입니다. 인터럽트 이외의 Java 측에서 스레드에 신호를 보내는 방법이 있습니까? 네이티브 측에서 실제로 확인중인 사항이 있습니까? – user363420

+0

수표로 FFMPEG 코드를 처리 할 수는 없지만 프레임 당 avcodec avformat 비트를 호출하는 JNI 코드를 체크인 할 수 있습니까? – Will

+0

프레임 처리 루프에 있었다면, 그럴 수도 있습니다. 그러나 스레드가 처음에 URL을 열려고하면 블로킹을하고 있습니다. (사용자가 URL을 잘못 입력 한 경우 걱정되며 리소스를 확보하려고합니다. 왜냐하면 그들은 결코 어떤 데이터도받지 않기 때문입니다.) libavformat/utils.c의 av_open_input_file에 대한 호출이 차단되어있어 제대로 인터럽트되지 않았습니다. – user363420

2

는 방법을 살펴 Xuggle (FFmpeg에 대한 JNI 웨이퍼) FFmpeg는 인터럽트 콜백을 호출 할 때마다 Xuggler가 Java로 호출하여 스레드가 인터럽트되었는지 확인하고 참이면 true를 반환합니다.

+0

Lol! 실제로 Xuggle을 사용하고 있습니다. 이 질문은 실제로 Xuggle 포럼에서 작성한 게시물의 중복입니다. http://groups.google.com/group/xuggler-users/browse_thread/thread/30d73c1b1a6bb95c 감사합니다. – user363420

관련 문제