본문 바로가기

안드로이드

JNI ExceptionCheck , ExceptionOccurred

1. 일반적인 JNI function call 은 NULL 과 같은 return 으로 예외상황을 알립니다. 
 
2. return value를 통해 error 인지 알 수 없을 경우에는 exception check 를 해주어야 합니다. 현재 thread 에서 일어난 pending exception 의 체크는 ExceptionOccurred 를 통해 check 할 수 있습니다. ( JDK 1.2 에서는 ExceptionCheck 를 사용할 수 있습니다. )

3.Native code 는 pending exception 을 다음과 같이 2가지 방법으로 처리합니다.

 
- exception 발생시 바로 return 을 해서 caller 가 exception을 handle 할 수 있도록 합니다.
- ExceptionClear 를 호출하여 exception 을 clear 한 후에 error handling 을 해당 코드에서 수행.
 
다른 JNI function 을 호출하기 전에 pending exception 을 check 하고 handle 한 다음에 clear 해주는것은 "엄청나게" 중요합니다. pending exception 이 있는 상태로 다른 JNI 함수를 호출하는 것은 엄청나게 위험합니다. 어떤 결과를 초래할 지 모릅니다. Exception 이 발생한 상황에서는 exception 을 handle 하거나, resource 를 해제하는 등의 방어적인 느낌의 JNI function 들만 안전하게 call 할 수 있습니다.

ExceptionCheck 함수는 JDK 1.2 부터 등장합니다. ExceptionOccurred 와 비슷합니다. 다른 점은 ExceptionCheck 는 exception object 에 대한 reference 를 던지지 않고, JNI_TRUE 나 JNI_FALSE 만을 던집니다. 그래서 그냥 exception 여부만 알려면 ExceptionCheck 가 ExceptionOccurred 보다 좋습니다.

 

출처 : https://aroundck.tistory.com/623