PDA

View Full Version : [Linux, Java, JNI, C] chi capisce questo errore?


ambuotiz
19-09-2005, 23:45
Ho scritto una classe Java che si chiama Ipktgen, utilizzando le JNI richiamo del codice scritto in C. Per poter funzionare la JNI, il codice C deve essere compilato in una libreria, in questo caso la libLpktgen.so.
Sinteticamente il funzionamento è questo: scrivo un file C, lo compilo in una libreria e dal codice java carico questa libreria.
Credo che l'errore sia dovuto a questo: la classe Ipktgen carica la libreria libLpktgen.so ma il caricamento si blocca quando incontra la riga di codice "libnet_init". libnet_init è una funzione primitiva utilizzata da una libreria che ho importato correttamente nel file C, quindi non capisco perchè non ne riconosce il significato, sapete aiutarmi?

[root@localhost codice]# java Ipktgen
Exception in thread "main" java.lang.UnsatisfiedLinkError: /usr/java/j2sdk1.4.2_08/jre/lib/i386/client/libLpktgen.so: /usr/java/j2sdk1.4.2_08/jre/lib/i386/client/libLpktgen.so: undefined symbol: libnet_init
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1586)
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1511)
at java.lang.Runtime.loadLibrary0(Runtime.java:788)
at java.lang.System.loadLibrary(System.java:834)
at Ipktgen.<clinit>(Ipktgen.java:4)

kingv
20-09-2005, 10:41
posta l'output di:
ldd /usr/java/j2sdk1.4.2_08/jre/lib/i386/client/libLpktgen.so

ilsensine
20-09-2005, 12:15
Ti avevo già consigliato di linkare la tua libreria con libnet, lo hai provato?
libnet_init è una funzione primitiva utilizzata da una libreria che ho importato correttamente nel file C
Nei file C non si "importano" le librerie, ma si includono gli header (che si limitano a definire le funzioni della libreria). Se non dici al linker che la tua libreria usa quell'altra, non può essere caricata.

ambuotiz
20-09-2005, 13:01
Ti avevo già consigliato di linkare la tua libreria con libnet, lo hai provato?

Nei file C non si "importano" le librerie, ma si includono gli header (che si limitano a definire le funzioni della libreria). Se non dici al linker che la tua libreria usa quell'altra, non può essere caricata.

Per errore ho fatto un cross post.
il problema è che nel file C c'è la riga #include <libnet.h> come faccio a farlo includere nella libreria condivisa?
Ho porvato a scrivere così ma mi da lo stesso errore:
gcc -shared -o -lnet libLpktgen.so pktgen.c

kingv
20-09-2005, 13:41
non devi farlo includere, per aggiungere una directory alla lista di quelle utilizzate per cercare gli header devi usare l'opzione -I seguita dal path della directory che contiene libnet.h

ilsensine
20-09-2005, 13:55
il problema è che nel file C c'è la riga #include <libnet.h> come faccio a farlo includere nella libreria condivisa?
L'include serve solo a rendere "visibili" i prototipi delle funzioni, ovvero a informare il compilatore che esistono. Come verranno procurate non interessa al compilatore, ed in effetti esistono diversi modi per farlo.
Ho porvato a scrivere così ma mi da lo stesso errore:
gcc -shared -o -lnet libLpktgen.so pktgen.c
Dopo -o il gcc si aspetta il nome del file di uscita, ovvero è una opzione che richiede un parametro. Devi semplicemente cambiare l'ordine:
gcc -shared -o libLpktgen.so pktgen.c -lnet

ambuotiz
20-09-2005, 14:25
funziona.
grazie 1000 :)