En años anteriores, creamos un programa que usa el protocolo X25. Fue hecho en lenguaje C y funciona bien para una máquina Sun-Fire con Solaris 5.9. Recientemente, estamos trabajando con java 6 en la misma máquina, y estamos tratando de adaptar ese viejo programa en C para trabajar con Java a través de jni. Así que han hecho algunas modificaciones en el antiguo programa C y creó una biblioteca compartida llamada x25lib.so
Error con jni (java6) y código nativo X25 (lenguaje C) cuando el código usa la llamada al sistema "connect()" en Solaris 5.9
pero he encontrado un problema de tiempo de ejecución usando JNI y X25: Cuando la función C se invoca desde Java a través de JNI, el código C hace no funciona de la misma manera que cuando se invoca desde otro programa C.
hormigón, utilizando JNI, el código C en la biblioteca compartida funciona bien hasta que se invoca la llamada al sistema connect()
, a continuación, devuelve -1,
Pero invocando el mismo código C de mi biblioteca compartida desde otro programa de C devuelve 0 (ok)
En ambos casos, el código C en la biblioteca compartida no recibe parámetros externos por lo que las condiciones son las mismas, no entiendo si cargar mi biblioteca compartida "x25lib.so" de Java tiene un poco diferencia que induce connect()
en C falla.
el uso de "armadura" de comandos de java he encontrado el error:
/2: connect(5, 0xFD878B75, 112, 1) Err#22 EINVAL
la misma, pero la invocación de la librería compartida de otro programa C:
connect(4, 0xFFBFE794, 114, 1) = 0
por lo que funciona bien sólo pure C,
¿Existe alguna otra consideración para usar jni y X25 para Solaris 5.9?
IMPORTANTE: C El código en la biblioteca compartida es idéntico en ambos casos.
TIEMPO DE COMPILACIÓN:
a. Creando x25lib.so
cc -w -fd -G -Kpic subs.o -L/opt/SUNWconn/lib -R/opt/SUNWconn/lib -lsockx25
-lsocket -lnsl -I"/SDK/jdk/include/" -I"/SDK/jdk/include/solaris/"
-o x25lib.so -h x25lib.so x25jni.c
b. Creación de un programa C de prueba con esa biblioteca compartida:
cc -w x25lib.so -o x25test x25test.c
where `x25test.c` contains:
#include <stdio.h>
main()
{
java_x25();
}
c. Utilización de Java:
public class X25 {
static {
System.load("/home/x25lib.so");
}
public native void ejecutaComando();
}
public class TestX25 {
public static void main(String ... args) {
X25 x25 = new X25();
x25.ejecutaComando();
}
}
biblioteca Luego, en el código C compartida:
/*
* Class: X25
* Method: ejecutaComando
* Signature:()V
*/
JNIEXPORT void JNICALL Java_X25_ejecutaComando
(JNIEnv *env, jobject obj)
{
java_x25();
}
por lo que finalmente ambos programas (Java y C) llame exactamente la misma C código en la biblioteca compartida:
java_x25()
Sin parámetros, así que ejecute el mismo código.
¿Por qué funciona bien cuando se llama desde C, pero falla cuando se llama desde Java?
Gracias por cualquier consejo.
¿Seguro de código independiente de su 'C' es idéntica a su código JNI? – EJP
Gracias por su respuesta EJP. Sí, el código es idéntico, esa es mi frustación.Edito mi pregunta y agrego el código jni donde se puede ver que se invoca el mismo código que en el código C independiente. – aoe