바로 JNI에서 전송 된 예외를 실행하는 자바 VM을 강제 할 수있는 방법이 있습니까?

vollitwr :

나는 주 JNI 스레드에서 자바 예외를 보내야합니다. 나는 그런 일을 할 다음 코드를 사용 :

if (vm->AttachCurrentThread(reinterpret_cast<void **>(&env), nullptr) != JNI_OK || env == nullptr) {
    std::cerr << "Get env for current thread failed.\n";
    return ;
}
jclass exClass = env->FindClass("[JavaClassName]");
if (exClass != nullptr) {
    env->ThrowNew(exClass, "[ExceptionMessage]");
}
env->DeleteLocalRef(exClass);
vm->DetachCurrentThread();

그것은 어떻게 든 작동합니다. 나는 우리가 사용하지 않을 경우 첨부와 분리 한 후 예외는 자바 VM에서 JNI 호출이 완료된 후에 만 ​​발생합니다 (단지에만 던져를 사용하는) 것을 발견했다. 우리가 사용하는 경우 연결 후 분리 호출에서 예외 인상을 분리합니다. 더 빨리 일을 만들 수있는 올바른 방법인가? 예외 처리를 위해서 DetachCurrentThread를 호출 할 때까지 연기하는 이유를 나는 아직도 이해가 안 ()? 나는 안드로이드를 사용합니다. 대단히 감사합니다.

리처드 Critten :

당신은 JNI 코드에있는 동안 현재 스레드에 부착 된 자바 인터프리터가 실행되고 있지 않습니다. 그래서 자바 측의 예외 (언 와인드 스택 프레임 등 캐치를) 처리 할 수있는 방법은 없습니다. 자바 예외는 보류중인 자바의 JNI 호출이 반환 및 인터프리터의 실행이 현재 자바 스레드가 계속 경우에만 실제로 발생으로 작성됩니다.

이 과정이 가짜의 종류 분리하지만 불안정한 상태에서 JNI 코드를 떠날 수 : 자바는 현재 실행되고, JNI는 반환하지 않았으며 여전히 코드를 실행 중입니다.

나의 선호하는 솔루션은 마찬가지로 자바 예외를 발생 즉시 만 (그리고합니다), JNI의 경계에 걸려 삭제는 C ++ 예외를 발생하는 것입니다. 는 C ++ 예외가 원인 스택 언 와인딩과 JNI 호출에서 빠른 깨끗한 종료에 순수하게 발생합니다.

추천

출처http://43.154.161.224:23101/article/api/json?id=330060&siteId=1