2011-12-12 2 views
1

현재 JNI를 많이 사용하는 프로젝트에 참여하고 있습니다. JNI는 나에게 매우 새로운 것입니다 ... 저는 그것에 대해 많이 읽었습니다. 한 가지 문제가 있습니다. 하나의 기본 함수에서 반환하고 싶습니다. 작업의 상태 인 정수이며 GetStringUTFChars()를 사용하여 문자열을 할당 할 수없는 경우 특정 오류 코드를 반환하려고합니다.JNI : GetStringUTFChars()가 실패시 OOM을 던지지 않습니까?

하지만 동의하는 것이 문서화가 :

저는 새로운 문서이기 때문에 두 번째 문서를 믿는 경향이 있습니다. 내가 잘못한 건가?

답변

0
잘하고 ulimit와 함께 연주하고 네이티브 실패를 유발하는 등 얻을 후, 나는 인해 GetStringUTFChars에 대한의 malloc()() 할 수 없다는에 JVM 충돌있어, OK

:/

나는 '생각 그냥 실패 할 경우 NULL을 반환한다고 가정하고,이 작업이 끝났다고 가정합니다. JVM이 충돌하기 전에 확실히 충돌 할 것입니다.

2

나는 두 세트의 문서가 동의한다고 생각한다. (최소한 나는 지금보고있는 버전이다.) http://java.sun.com/docs/books/jni/html/objtypes.html에서

:

는 GetStringUTFChars에의 반환 값을 확인하는 것을 잊지 마십시오. Java 가상 머신 구현은 UTF-8 문자열을 보관할 메모리를 할당해야하기 때문에 메모리 할당이 실패 할 가능성이 있습니다. 이 경우 GetStringUTFChars는 NULL을 반환하고 OutOfMemoryError 예외를 throw합니다. 6 장에서 배우 겠지만, JNI를 통해 예외를 던지는 것은 Java 프로그래밍 언어에서 예외를 발생시키는 것과 다릅니다. JNI를 통해 던져진 보류중인 예외는 네이티브 C 코드의 제어 흐름을 자동으로 변경하지 않습니다. 대신 C 함수의 나머지 명령문을 건너 뛰려면 명시 적 return 문을 발행해야합니다. Java_Prompt_getLine이 반환 된 후 예외는 Prompt.getLine 기본 메소드의 호출자 인 Prompt.main에서 발생합니다. http://docs.oracle.com/javase/1.5.0/docs/guide/jni/spec/functions.html에서

:

RETURNS : 작업이 실패 할 경우

가 수정 된 UTF-8 캐릭터 라인의 포인터, 또는 NULL를 돌려줍니다.

그래서 NULL 실패에 반환됩니다,하지만 첫 번째는 더 나아가 상태 것을 모두 상태 그 JNI C++ 함수가 반환은 예외가 자바 층 내에서 발생합니다 한 번.

관련 문제