Newsgroup: it.comp.os.linux.development
Titolo: chi mi aiuta con questo errore?

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) 

Non so aiutarti con precisione, ma magari con un mio dubbio ti metto 
sulla strada giust.... la libreria  libnet_ini la hai lincata 
staticamente alla libreria che importi ? altrimenti penso devi 
controllare che la jvm riesca ad accedere anche a questa seconda 
libreria.... su solaris controllerei che tutte le librerie necessarie 
alla tua libreria siano in path contenuti nella variabile di ambiente 
LD_LIBRARY_PATH .... (su linux forse ldconf....) ....cmq non so in 
dettaglio come la jvm tira su le librerie richiamate da una libreria 
usata via jni ..... per sapere quali librerie hai bisogno cmq penso 
basti "ldd libLpktgen.so".
ciao
Pier Paolo


 
-- 
Matteo Settenvini
FSF Associated Member
Email : 
mat...@member.fsf.org
-----BEGIN GEEK CODE BLOCK-----
Version: 3.12
GCS d--(-) s+:- a-- C++ UL+++
P?>++ L+++>$ E+>+++ W+++ N++ o?
w--- O- M++ PS++ PE- Y+>++
PGP+++ t+ 5 X- R tv-- b+++ DI+
D++ G++ e h+ r-- y?
------END GEEK CODE BLOCK------

Premetto che non sono ferrato su JNI, ma penso che il problema sia nel 
fatto che la tua libreria ha dipendenze da altri oggetti che la jvm non 
riesce a tirare su.
Prova a controllare la variabile LD_LIBRARY_PATH o il ldconf. Per vedere 
quali librerie la tua libreria si tira dietro lo vedi con ldd nomelibreria.
Il fatto che la hai importata non vuol dire che poi sia stata linkata 
staticamente e sia effettivamente contenuta nello shared object che stai 
tirando su. Non so se a sto punto in java devi tirarti su a manina anche 
tutte le librerie correlate alla tua in quanto non ho una conoscenza 
buona di JNI o se sia sufficiente fargliele vedere via LD_LIBRARY_PATH o 
via ldconfig.
ciao
Pier Paolo


digitando nm -D libLpktgen.so (che non so cosa fa), mi da questo risultato:
[root@localhost codice]# nm -D libLpktgen.so
000019b4 A __bss_start
         w __cxa_finalize
000018b8 A _DYNAMIC
000019b4 A _edata
000019b8 A _end
00000890 T _fini
00001994 A _GLOBAL_OFFSET_TABLE_
         w __gmon_start__
000005b4 T _init
000006cc T Java_Ipktgen_Pktgen
         w _Jv_RegisterClasses
         U libnet_build_ipv4
         U libnet_init
proprio l'ultima cosa libnet_init è la funzione che non mi viene
riconosciuta

Andrea ha scritto:

quella "U" dice che il simbolo non è definito nella libreria, ma deve
essere presente in qualche altro DSO esterno. Quindi libLpktgen.so NON
ha il codice per libnet_init al suo interno, ma solo un suo "segnaposto".
Quindi la domanda rimane: hai scritto tu quella libreria, o no? Cosa
stai cercando di ottenere (che non si possa avere direttamente con Java)?
Senza un po' di codice Java, non so cos'altro aggiungere.
Ciao,
