|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Bannato
Iscritto dal: Jan 2002
Città: Roma
Messaggi: 1130
|
Problema con le JNI
Ho un problema con le JNI quando scrivo il codice sorgente C
questa è una parte del codice sorgente C (ci metto anche i numeri di riga per maggior chiarezza. 4. JNIEXPORT jint JNICALL Java_Ipktgen_Pktgen 5. (JNIEnv *, jobject obj, jint ttl, jlong d_ip, jintArray payload); 6. { durante la compilazione mi da questo errore: pktgen.c:5: error: syntax error before '{' token |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jan 2001
Città: Milano
Messaggi: 5707
|
togli il punto e virgola in fondo alla riga.
|
|
|
|
|
|
#3 | |
|
Bannato
Iscritto dal: Jan 2002
Città: Roma
Messaggi: 1130
|
Quote:
Ora sono riuscito a compilare tutto (non pensavo di riuscirci) mi rimangono solo un paio di warning: pktgen.c: In function `main': pktgen.c:112: warning: control reaches end of non-void function credo che la parte di codice che da errore sua questa: 110. return 0; 111. } 112. int main() {} |
|
|
|
|
|
|
#4 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
anziché
int main() {} prova a scrivere int main() { return 0; } |
|
|
|
|
|
#5 |
|
Bannato
Iscritto dal: Jan 2002
Città: Roma
Messaggi: 1130
|
Posto tutto il codice:
#include <stdio.h> #include <libnet.h> #include "Ipktgen.h" JNIEXPORT jint JNICALL Java_Ipktgen_Pktgen (JNIEnv *env, jobject obj, jint ttl, jlong d_ip, jintArray payload) { struct input_struct { u_long s_ip; /* source ip address */ u_long d_ip; /* destination ip address */ u_char *data; /* ip payload */ u_short data_size; /* ip payload size */ } input; u_short h_lenght; /* header lenght */ short n; /* byte wrote */ char err_buf[LIBNET_ERRBUF_SIZE]; /* error buffer */ libnet_t *l; /* libnet context handler */ /* set default */ input.d_ip=0; input.data_size=0; input.data=NULL; /* initialize libnet_t* */ if ((l=libnet_init(LIBNET_RAW4, /* injection type */ NULL, /* network interface */ err_buf))==NULL) /* error buffer */ { fprintf (stderr, "Error: %s\n", err_buf); return -1; } /* build ipv4 header */ if (libnet_build_ipv4 ( h_lenght+input.data_size,/* len */ 0, /* tos */ 0x200, /* id */ 0, /* frag */ ttl, /* ttl */ IPPROTO_TCP, /* transport protocol */ 0, /* sum */ input.s_ip, /* source address */ d_ip, /* destination address */ NULL, /* ip payload */ 0, /* ip payload size */ l, /* libnet context */ 0 /* we don't need ptag */ )==-1) { fprintf (stderr, "Error %s\n", libnet_geterror(l)); return 1; } printf ("* IP header builded\n"); /* write packet */ if ((n=libnet_write(l))==-1) fprintf (stderr, "Error %s\n", libnet_geterror(l)); printf ("* Packet correctly wrote on wire: %d bytes\n", n); /* destroy all */ libnet_destroy(l); return 0; } int main() {} |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Jan 2001
Città: Milano
Messaggi: 5707
|
se vuoi che lo compiliamo ci serve anche il .h
il main toglilo non ne hai bisogno |
|
|
|
|
|
#7 | |
|
Bannato
Iscritto dal: Jan 2002
Città: Roma
Messaggi: 1130
|
Quote:
/* DO NOT EDIT THIS FILE - it is machine generated */ #include "jni.h" /* Header for class Ipktgen */ #ifndef _Included_Ipktgen #define _Included_Ipktgen #ifdef __cplusplus extern "C" { #endif /* * Class: Ipktgen * Method: Pktgen * Signature: (IJ[I)I */ JNIEXPORT jint JNICALL Java_Ipktgen_Pktgen (JNIEnv *, jobject, jint, jlong, jintArray); #ifdef __cplusplus } #endif #endif |
|
|
|
|
|
|
#8 |
|
Bannato
Iscritto dal: Jan 2002
Città: Roma
Messaggi: 1130
|
se tolgo il main mi da questo errore:
root@localhost codice]# gcc -Wall -o2 pktgen.c -o pktgen -lnet /usr/lib/gcc/i586-mandrake-linux-gnu/3.4.1/../../../crt1.o(.text+0x18): In funct ion `_start': ../sysdeps/i386/elf/start.S:98: undefined reference to `main' collect2: ld returned 1 exit status |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Jan 2001
Città: Milano
Messaggi: 5707
|
devi compilare una shared library, non un eseguibile....
gcc pktgen.c -o pktgen.so -shared -I/usr/java/j2sdk1.4.2_04/include -I/usr/java/j2sdk1.4.2_04/include/linux |
|
|
|
|
|
#10 | |
|
Bannato
Iscritto dal: Jan 2002
Città: Roma
Messaggi: 1130
|
Quote:
gcc -c -Wall -o2 pktgen.c -o pktgen non conosco bene tutti i parametri di gcc, cosa sambia scrivendo come ho fatto io? |
|
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Jan 2001
Città: Milano
Messaggi: 5707
|
Quote:
se usi '-c' come hai fatto tu non passa per lo stadio di linking. per compilare compila, ma ottieni un file oggetto cui non puoi accedere da java via jni. |
|
|
|
|
|
|
#12 |
|
Bannato
Iscritto dal: Jan 2002
Città: Roma
Messaggi: 1130
|
ho un problema che non so come risolvere: devo passare un array di interi java al codice C. Per farlo ho scritto questo codice:
jsize len = (*env)->GetArrayLength(env, payload); //payload è il nome dell'array java di lunghezza len jint *body = (*env)->GetIntArrayElements(env, payload, 0); int cpayload [len]; //creo l'array C int i; for (i=0; i<len; i++) { cpayload[i] = body[i]; //copio i valori dell'array java nell'array C } input.d_ip=0; input.data_size=len; input.data=(u_char)*body; //questa riga mi da errore l'errore che mi da il compilatore è questo: warning: assignment makes pointer from integer without a cast P.S. la variabile data è definita in questo modo: u_char *data; |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 18:44.


















