Existe uma maneira de forçar Java VM para executar imediatamente uma exceção enviado de JNI?

vollitwr:

Eu preciso enviar uma exceção em Java da principal jni-thread. Eu uso o seguinte código para fazer tal coisa a:

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();

De alguma forma funciona. Eu descobri que, se não utilizar o ligar e desligar (basta usar apenas o lance), então a exceção levanta somente após a jni-chamada de Java VM estiver concluída. Se usarmos o ligar e desligar, em seguida, os aumentos de exceção na chamada desanexar. É uma maneira correta de fazer as coisas mais rápido? Eu não ainda entender por que o processamento de exceção é adiada até que uma chamada para DetachCurrentThread ()? Eu uso Android. Muito obrigado.

Richard Critten:

O intérprete Java anexado ao seu segmento atual não está em execução enquanto você está no código JNI. Portanto, não há maneira de processar a excepção do lado da Java (quadros de pilha de desenrolamento, captura etc). A exceção Java é criado como pendente e só realmente lançada quando a chamada JNI retorna para Java e a execução do intérprete continua para o seu atual thread Java.

Destacando tipo de falsificações este processo, mas pode deixar o seu código JNI em um estado instável: Java está agora em execução, JNI não voltou e ainda está em execução o seu código.

Minha solução preferida é a de lançar a exceção Java como você faz e imediatamente lançar uma exceção de C ++ que só é (e deve ser) capturado na fronteira JNI e descartados. A exceção C ++ é jogado exclusivamente com a causa pilha descontrair e uma saída rápida e limpa da chamada JNI.

Acho que você gosta

Origin http://43.154.161.224:23101/article/api/json?id=330061&siteId=1
Recomendado
Clasificación