2011-02-10 9 views
5


Comencé a buscar en JNI y por lo que entiendo es que si se produce un problema con el dll cargado, el jvm es posible terminar en el acto.
I.e. el proceso no puede protegerse, p. como cuando atrapa una excepción.
Entonces, si mi comprensión es correcta, mi pregunta es si hay un enfoque/patrón estándar para esta situación cuando se usa jni.
O para decirlo de otra manera, ¿hay procesos que utilizan jni diseñados de manera que se eviten estos problemas? ¿O no se espera que ocurran tales problemas?jni starter pregunta

Gracias.

Respuesta

3

Sí, la JVM terminará, y esa es una de las razones por las que el código JNI es realmente difícil de depurar. Si está usando código C++, puede usar excepciones y luego asignarlas a una excepción Java que al menos le brinde cierto nivel de seguridad pero no ayuda con cosas como mal acceso a memoria, etc.

Desde el punto de vista de la arquitectura Sugiero desacoplar el código de JNI tanto como sea posible. Cree una estructura de clase/procedimiento que sea totalmente comprobable desde C++/C y deje que el código JNI haga solo todas las conversiones. Si la JVM se bloquea, al menos sabrá dónde debe mirar.

+0

La primera idea que estaba pensando fue colocar la publicación, estaba generando un nuevo proceso para acceder a la dll. De esta manera, el proceso original sobrevive.Pero no estoy seguro de si esto se utiliza como una persona – Cratylus

+0

Hm, pero en ese caso también podría no utilizar JNI en absoluto y cambiar a otra forma de comunicación entre procesos. Solo usaría JNI si la velocidad es el problema más grande (y entonces no tiene sentido ponerlo en su propio proceso). Es un intercambio entre velocidad y seguridad. – Daff

1

Los principios no son diferentes de cualquier aplicación multi-hilo C:

  1. Siempre revise todas sus aportaciones a fondo.
  2. Libere siempre la memoria temporal que haya asignado.
  3. Asegúrate de que tus funciones sean reentrantes.
  4. No confíe en un comportamiento indefinido.

La máquina virtual Java no ofrece protección adicional para su código nativo, si falla o tiene una fuga, su VM fallará o tendrá fugas.

+0

@Daff: La primera idea que estaba pensando fue colocar la publicación, estaba generando un nuevo proceso para acceder al dll. De esta manera sobrevive el proceso original. Pero no estoy seguro de si esto se usa como un asistente – Cratylus

+0

@ user384706 Engendrar un nuevo proceso no está exento de riesgos y es inaceptablemente lento para la mayoría de los usos. Además, si está comenzando un proceso externo de todos modos, ¿por qué no hacerlo desde Java puro? – biziclop

+0

La idea de que el código nativo se usaría en casos específicos que no se podían hacer en Java, el proceso original genera un nuevo proceso para acceder al dll, es decir, cualquier resultado/mensaje se enviará al proceso padre. Si algo sucede, el segundo proceso muere, pero el proceso original que podría hacer mucha más funcionalidad (acceder a un dll) es solo una parte, seguiría vivo. No estoy seguro de si este es un enfoque utilizado. Puede ser es demasiado? – Cratylus

0

Puede tener exactamente el mismo espectro de manejo de errores en una biblioteca JNI que en cualquier otra cosa.

Puede usar try/catch. Si está en Windows, puede usar SEH. Si estás en Linux, puedes llamar a sigaction.

Aún así, si se equivoca y hay un SIGSEGV, su JVM probablemente sea un brindis, ya sea que intente captar esa señal o no.