View Full Version : Problema con le JNI
ambuotiz
05-09-2005, 16:12
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
togli il punto e virgola in fondo alla riga.
ambuotiz
06-09-2005, 12:00
togli il punto e virgola in fondo alla riga.
hai ragione.
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() {}
anziché
int main() {}
prova a scrivere
int main() {
return 0;
}
ambuotiz
06-09-2005, 13:41
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() {}
se vuoi che lo compiliamo ci serve anche il .h ;)
il main toglilo non ne hai bisogno
ambuotiz
06-09-2005, 19:36
se vuoi che lo compiliamo ci serve anche il .h ;)
il main toglilo non ne hai bisogno
Il .h è questo:
/* 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
ambuotiz
06-09-2005, 23:35
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
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
ambuotiz
07-09-2005, 09:09
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
Se scrivo così mi compila lo stesso:
gcc -c -Wall -o2 pktgen.c -o pktgen
non conosco bene tutti i parametri di gcc, cosa sambia scrivendo come ho fatto io?
Se scrivo così mi compila lo stesso:
gcc -c -Wall -o2 pktgen.c -o pktgen
non conosco bene tutti i parametri di gcc, cosa sambia scrivendo come ho fatto io?
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.
ambuotiz
07-09-2005, 10:03
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;
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.