¿Hay una manera de forzar máquina virtual de Java para ejecutar inmediatamente una excepción enviado desde JNI?

vollitwr:

Necesito enviar una excepción en Java de la principal JNI-hilo. Yo uso el siguiente código para hacer tal cosa:

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 alguna manera funciona. He descubierto que si no utilizamos el conectar y desconectar (sólo tiene que utilizar solamente un saque de banda), entonces la excepción plantea sólo después de finalizada la JNI-llamada de Java VM. Si utilizamos el unir y separar a continuación, los aumentos de excepción en la llamada de separación. ¿Es una forma correcta de hacer las cosas más rápido? Yo no entiendo por qué sigue el procesamiento de excepciones se difiere hasta que una llamada a DetachCurrentThread ()? Yo uso de Android. Muchas gracias.

Richard Critten:

El intérprete de Java instalada en la hebra actual no está funcionando mientras usted está en el código JNI. Así que no hay manera de procesar la excepción en el lado de Java (marcos de pila de desenrollado, la captura, etc). La excepción Java se creó como pendiente y sólo realmente tirado cuando la llamada JNI vuelve a Java y la ejecución del intérprete continúa para su actual hebra Java.

Extracción tipo de falsificaciones este proceso, pero podría dejar su código JNI en un estado inestable: Java ya está funcionando, JNI no ha regresado y se sigue ejecutando su código.

Mi solución preferida es lanzar la excepción Java como lo hace y lanzar inmediatamente una excepción de C ++ que sólo es (y debe ser) atrapado en el límite de JNI y se desecha. La excepción de C ++ se lanza puramente a causa pila desenrollar y una rápida salida limpia desde la llamada JNI.

Supongo que te gusta

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